华为电脑试题
java中String的++编译器会自动将String转换成StringBuffer。
java编程思想第二版附录A:传递和返回对象
中文版,第759页
英文版1054页
重载的“+”和StringBuffer部分表示
String类的对象被设计为常量,并使用前面介绍的伴随类技术。如果你看一下JDK文件,
String类(稍后将对其进行总结),您会发现该类中每一个旨在修改String的方法都在
在修改过程中,确实生成并返回了一批新的String对象。原始字符串没有受到影响。
C++的Const提供了编译器支持的对象恒常性,这是Java所没有的。想得到一双不变的
就像,你必须自己做,就像绳子一样。
因为String对象是常量,所以您可以随意为一个字符串取多个别名。因为它是只读的,任何
一个引用也不可能修改对象,所以不会影响其他引用。因此,只读对象很好地解决了别名问题。
标题。
这似乎解决了所有的问题。每当你需要修改一个对象时,创建一堆新的修改过的对象,比如
像这样的绳子。但是,这对于某些操作来说效率太低。字符串的重载运算符“+”是一个重
重要的例子。重载意味着“+”被赋予了特定类的额外含义。(对于字符串重载的'+'和'+= ',
是Java中唯一重载的运算符,Java不允许程序员重载其他运算符。)
使用字符串对象时,'+'用于连接字符串对象:
string s = " ABC "+foo+" def "+integer . tostring(47);
你可以想象它是如何工作的。字符串“abc”可能有一个生成连接的append()方法。
添加了新的字符串对象“abc”和foo。新字符串与“def”连接后,生成另一个新字符串。
诸如此类。
C++允许程序员随意重载运算符。因为这通常是一个复杂的过程,所以Java设计者认为这是一个“坏”的函数。
不应包含在Java中
中等。其实也没那么差。具有讽刺意味的是,在Java中使用运算符重载比在C++中容易得多。
当然,这是可以运行的,但是它需要大量的中间字符串对象来生成最终的新字符串,而那些
偶尔,结果需要回收。我怀疑是Java设计者首先这么做的(这是软件设计之一)
教训是,你不可能知道一切,直到它被编码和工作。我猜他们发现这种做法
无法忍受的低效率。
解决方案是一个可变的伴生类,类似于前面的例子。String的伴生类称为StringBuffer,它在
在对一些表达式求值时,尤其是String对象使用重载的'+'和'+= '时,编译器会自动创建它们。
字符串缓冲区.以下示例说明了所发生的情况:
//:附录a:immutable strengs . Java
//演示StringBuffer。
导入com . Bruce eckel . simple test . *;
公共类不可变字符串{
私有静态测试监视器= new Test();
公共静态void main(String[] args) {
String foo = " foo
string s = " ABC "+foo+" def "+integer . tostring(47);
system . out . println(s);
//使用StringBuffer的“等效项”:
字符串缓冲器sb =
new string buffer(" ABC ");//创建字符串!
sb .追加(foo);
某人追加(“def”);//创建字符串!
sb . append(integer . tostring(47));
system . out . println(sb);
monitor.expect(新字符串[] {
“abcfoodef47”,
" abcfoodef47 "
});
}
} ///:~
在生成字符串S的过程中,编译器使用sb执行大致相当于以下工作的代码:创建一个
一个StringBuffer,使用append()直接向这个StringBuffer对象添加一个新字符串(而不是每
每次都做一份新的)。虽然这种方法更有效,但对于引号中的字符串,如“abc”
而“def”,是不行的,编译器会把它变成String对象。因此,尽管StringBuffer提供了
为了提高效率,对象的数量可能比您预期的要多。
String和StringBuffer类
下面总结了String和StringBuffer都可用的方法,可以感受一下与它们交互的方式。桌子
并不是所有的方法都包括在内,只包括与本讨论相关的重要方法。重载方法放在单独的列中。
第一个是字符串类:
方法参数,重载用法
构造函数重载:默认值,空参数,创建字符串对象。
字符串、字符串缓冲区、
字符数组,字节数组。
length()字符串中的字符数。
字符串中指定位置的CharAt() int索引。
人物。
Getchars(),复制源的起点和终点,将Char或byte复制到外部。
getBytes()系统中的目标数组,目标数组的数组。
索引。
ToCharArray()生成char[],其中包含String。
的所有字符。
Equals(),比较字符串,两个字符串的等价性测试。
equals-IgnoreCase()
CompareTo()根据字典顺序比较字符串。
和参数,结果是负的,零,
或者正值。情况有所不同。
IndexOf(),重载:char,char和from如果不包含在当前字符串中。
LastIndexOf()以index、String和String参数开头,返回-1,否则返回参数。
和起始索引。数字在字符串中的位置索引。
LastIndexOf()从末尾开始反转。
搜索到。
SubString()重载:起始索引,起始索引返回一个新的字符串对象,package
和终止索引包含特定的字符集。
要连接的Concat()字符串返回一个新的字符串对象,在原
在字符串后追加参数字符。
Replace()搜索旧字符,用于替换并在指定字符被替换后返回新字符。
新字符串对象。如果没有发生
替换并返回原始字符串。
生成一个且只有一个字符串。
引用。
可以看到,当一个字符串的内容必须修改时,String的每个方法都会谨慎地返回一个新的字符串。
对象。另请注意,如果内容不需要修改,该方法将返回对源字符串的引用。这样可以节省存储空间。
空间和开销。
下面是StringBuffer类:
方法参数,重载用法
构造函数重载:空参数,要创建的缓冲区创建一个新的StringBuffer。
长度,字符串的来源。对象。
ToString()是由这个StringBuffer生成的。
字符串.
length()字符串缓冲区中的字符
号码。
SetLength()表示缓冲区中字符串的整数长度,用于截断或扩展原始字符串。
如果扩展,用null填充新的。
空间增大。
CharAt()是一个整数,表示所需元素的位置。返回缓冲区中的字符。
位置。
SetCharAt()表示所需元素位置的整数,以及新修改位置的值。
的字符值
GetChars()将源的起点和终点以及副本的目的地复制到外围数组。不
的结束数组和目标数组的索引。字符串中有一个。
getBytes().
Append()重载:将对象、字符串和参数转换成字符串,然后追加。
Char[]、char[]和offset sum到达当前缓冲区的末尾,如果
Degree,boolean,char,int,如果需要,缓冲区会被放大。
长型、浮动型、双型。
Insert()已经重载,第一个参数是insert,第二个参数转换成字符串insert。
startpoint:Object的偏移值,进入当前缓冲区的指定位。
String,char[],boolean,set。如果需要,缓冲区将会扩展。
Char,int,long,float,big。
双份。
最常用的方法是append()。当计算包含“+”和“+=”运算符的字符串表达式时,编译器将使。
使用它。Insert()方法也有类似的形式,两种方法都是在缓冲区中做大量的操作,而不需要创建。
新对象。
字符串是特殊的。
到目前为止,您已经看到了String类不同于Java中的一般类。字符串有许多特殊的功能,
它不仅仅是一个Java内置类,它已经成为Java的基础。事实上,用双引号括起来
字符串都被编译器转换成String对象,还有专门重载的'+'和'+= '运算符。在本附录中,
您还可以看到其他特殊的特性:使用同伴类StringBuffer构造良好的恒常性,以及
一些额外的神奇功能。
/**********
对象操作是低效的
况且java对象都在堆里。
原文反复作用于对象。
这纯粹是白痴行为
**********/
// **********************************************************
公共静态字符串countStr(int count)
{
char ch[]= new char[count];
for(int I = 0;我& lt数数;i++)
ch[I]= ' A ';
String str =新字符串(ch);
返回字符串;
}
// **********************************************************