细看java.lang.String类
? 一)不可变的String:
??????? 首先String这个类是final的,不可被继承。String对象是不可变的,查看一下JDK文档是乎每个方法看起来都会修改String对象的值,实际上都是创建了一个全新的String对象,用来包含修改后的字符串内容。而最初的String对象则丝毫未动。
?????
public class TestString{public static String upcase(String s){ return s.toUpperCase(); } public static void main(String [] args){ String str = "hello"; System.out.println(str); String upcaseStr = upcase(str); System.out.println(upcaseStr); System.out.println(str); }}?
输出:hello HELLO hello????????
??????? 由此可见,str的内容并没有改变。当把str传递给upcase()方法时,实际传递的是一个引用。每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。
?
?二)?“+” 和“StringBuilder”
?????? String对象是不可变的,你可以给一个String对象添加任意多的别名,因为String对象具有只读特性,所以指向它的任何引用都不可能改变它的值。正是因为不可变性给String带来了性能上的问题。当我们执行如下的这句代码的时候
String s = "today"+"is"+"women's"+"day";? java虚拟机帮我们执行了一些操作,它会默认的给我们创建一个StringBuilder对象。来该对象来构建最终的String. 最后调用StringBuilder的toString()方法生成结果。然后将引用交给S。