华为电脑试题

首先批判鬼火狼烟的回答

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);

返回字符串;

}

// **********************************************************