两组基本概念
1、对象本身和对象的引用——对象本身即为字面意思;对象的引用是对象的储存地址
2、String常量和String引用变量
String类中每一个看起来会修改String对象的操作,实际上都是创建了一个全新的String对象,从而包含字符串的修改内容,而原来的String对象纹丝不动
简单的理解String的不变性
String s = "abcd";
String s2 = s;
s2=s 传递的是String对象的引用,即对象地址的copy
如果String对象是可改变的,那么下面代码中的s2,s3,s4将置于何地,该何去何从
String s = "abcd";
String s2 = s;
String s3 = s;
String s4 = s;
s = s.substring(1);
System.out.println(s);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
输出
bcd
abcd
abcd
abcd
String的相等问题(==比较的是对象引用的地址,如果引用于同一个地址,则为true。equals比较的两者的内容,内容一样,则为true)
String s1 = new String("abcd");
String s2 = new String("abcd");
String s3 = "abcd";
String s4 = "abcd";
System.out.println(s1==s2);
System.out.println(s3==s4);
System.out.println(s1==s3);
System.out.println(s1.equals(s3));
输出
false
true
false
true
第一条输出:new出的是两个对象,自然对象的引用不相等
第二条输出:String常量在编译时都储存在常量池中,对它进行自动创建对象,如果两个常量内容一样,就只创建一个对象
第三条输出:s1是new出来的对象引用,s3 是在编译时从常量池中在创建的对象引用,两者是不同的引用
总结:String的不可变与Stringbuffer和Stringbuilder的可变都是指对象本身,String StringBuffer Stringbuilder 内部都是基于char数组实现的,所以本质是对象本身的char数组的可变与不可变,而不是对象的引用是否可变