String和StringBuffer 里的串连接问题!
str = str + word;//字符串连接
与 tempStringBuffer.append(word);
有什么差别??
(str为Sring对象,tempStringBuffer为StringBuffer对象,word字符串字面量)
在连接后 str 与 word所在 存储空间是不是连续的??
是重新new了一个把str和word放进去还是别的什么?
------解决方案--------------------String类支持静态(不变的)的字符串。StringBuffer类则支持可修改的字符串。
用String类创建的字符串是只读的。
当使用“+”运算符将一些字符加到某String对象上时,结果产生了新的对象,而不是原来String对象的一个修改值。
例:
String str1 = "abc ",str2;
BufferString bfs = new BufferString( "abc ");
str2 = str1+ "d ";//now str1 is "abc " ;str2 is "abcd "
bfs.append( "d ");// now bfs is "abcd "
------解决方案--------------------StringBuffer就是重新生成了个新的对象,和 " "+str一样
------解决方案--------------------最重要的是一般来说StringBuffer的append执行效果要远高于String的+号(当然也有特殊情况),特别是在循环体内。
------解决方案--------------------如上所说,在涉及到字符运算时,最好使用StringBuffer
------解决方案--------------------最重要的是一般来说StringBuffer的append执行效果要远高于String的+号(当然也有特殊情况),特别是在循环体内
因为String 每次进行 + 操作,都会生成2个新的对象。浪费资源!影响效率。。。特别是在面试的时候
------解决方案--------------------关注
------解决方案--------------------关注
------解决方案--------------------关注
------解决方案--------------------字符串内存分配方式不同,如果内存资源受限或者要提高代码执行效率,最好使用StringBuffer方式
------解决方案--------------------String str1 = "hello ";
String str2 = "world ";
String str3 = "str1 ";
String str1 = str1 + str2;//String 赋值实际上这个是NEW了一个新的对象了,str1变了
System.out.println(str3);//str3没有变,这是因为str3指向的地址还是最早的str1所在的地址
这里所做的内部操作,其实不是把str1的内容改变为原str1+str2的内容这么简单, 而把创建一个新的String, 内容为str1 + str2的内容,然后再把str1这个引用重新指向新创建的String, 而str3还指向最早的str1地址,并且内容还是 "hello ".
而如果是StringBuffer的话,则直接更改str1的内容,而不是先创建一个新的StringBuffer.
StringBuffer b1=new StringBuffer( "hello ");
StringBuffer b2=b1;
b2.append( "world ");//StringBuffer赋值,操作b2还是那个对象
System.out.println(b1);
String对象是不可变对象,一旦创建之后就不能再被改变,StringBuffer对象则是可变对象,可变对象则可以在创建之后被改变.为获得更佳的性能你需要根据实际情况小心谨慎地选择到底使用这两者中的某一个。
String 是一种非常常用的数据类型,但由于 String 是不可变对象,在进行 String 的相关操作的时候会产生许多临时的 String 对象。
而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。
不过,一般做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。
------解决方案--------------------Java虚拟机会维护一个内部的滞留字符串对象的列表(字符串的常量池)来避免在堆内存中产生重复的 String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过 new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。
所以结论是,JVM会内在地为字符串字面量维护一些唯一的 String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过 new关键字创建的String对象而困扰,不过他们可以使用intern ()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。
同一个字符串对象被重复地创建是不必要的,String.intern ()方法可以避免这种情况。String.intern()方法检查字符串对象的存在性,如果需要的字符串对象已经存在,那么它会将引用指向已经存在的字符串对象而不是重新创建一个。
StringTest2.java
package com.performance.string;
// This class shows the use of intern() method to improve performance
public class StringTest2 {
public static void main(String[] args){