全部博文(2065)
分类: Java
2010-03-20 00:27:10
Java中的String与StringBuffer
[整理人:遥方 整理时间:
1、字符串连接操作中StringBuffer的效率要比String高!
分析以下这个语句:
String a = "123";
a = a + "456";
上面两句,虽然a的值最终改变了,但是实际上在编译的时候,第一句a是一个对象,被分配了一个地址,第二句执行时,原来的a被释放,然后重新分配。
过程:a 原本指向一 String object instance
("123"), a + "456" 会造出另一新的 String object instance
("123456"), 然后 a 再指向这新的 String instance.!
PS: 我的理解就是在string运算过程中会出现对象的释放----再建 这么一个过程!
1、原来的对象释放掉
2、建立起来新对象
3、重新指向新对象
对象的重新创建过程是非常耗资源的。注意String类对象的内容一旦被初始化就不能在改变了。
java中提供了“+”来连接两个String类型的字符串连接成一个新的字符串,在StringBuffer类中可以通过append 方法实现,
示例:
String
x="abc"+4+"def";
编译时等效于
String x=
new
StringBuffer().append("abc").append(4).append("def").toString();
再看下stringbuffer
StringBuffer b = new
StringBuffer("asd");
b.append("fgh");
在这个过程中,只存在b这么一个对象,b 一直都指向一个 StringBuffer instance. append 也只是改变此 instance 的內容而已.
三、在用String类对象直接+操作时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为
String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"Hello"和" world!"创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,
代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String("Hello"和" world!"),一个临时StringBuffer,和最后将StringBuffer转型成为的String("Hello world!")--它当然不是最初的s("Hello")了,这个引用的名称没变,但它指向了新的String对象。
PS:两个原始的String对象,临时StringBuffer对象,最后的String对象
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的
String 对象,然后将指针指向新的 String 对象,可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer 对象,并处理多少次无谓的强制类型转换哪!所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
PS:String是不可变对象。如果在运用字符串函数操作的时候其实是先干掉旧的对象再创建新的一个对象。
补充:
String
s1="hello";
String s2="hello";
其中s1 == s2 另外 s1.equals(s2) 皆为true
String s3=new
String("hello");
String s4=new
String("hello");
System.out.println(s4==(s3)); 返回为False
“==”比较的是两个字符串的对象引用,而“equals”比较的是两个字符串的内容。