String表示的是字符串常量,String类中内容一旦被初始化,其内容和长度就不能被更改
说到这里,可能有人就会疑惑了 (不是可以通过String类的replace()等方法来改变其内容和长度?)
String str = "abc";
System.out.println(str.replace("b", "12345"));
输出结果:a12345c
String str = "abc";
str = "aaaa!";
System.out.println(str);
输出结果:aaaa!
这里的字符串长度和内容不是都已经该变了吗,那岂不是和 String 类的特性相违背了
其实这里的改变并不是真正的改变,改变后的字符串是属于一个新的字符串对象,为什么这样说呢?
因为 String 内部被 final 修饰,在 String 对象初始化时,内存就会为其分配一个空间用于存储它的值,在执行str = “aaaa!”;语句后。内存就会将其作为一个新的 String 对象重新为其分配一处空间来存储它的值,而原来的 String 对象的值还存在于内存中,没有发生任何改变。
那为什么输出的结果是“aaaa!”而不是“abc”?
因为 str 只是一个 String 对象的引用指向,开始时指向"abc"存储地址,在创建了新的String对象后,该指向就指向了这个新的 String 值"aaaa!“的存储地址。所以输出的结果是"aaaa!” 而不是"abc"
String 和 StringBuffrer 的区别
① StringBuffer 类弥补了 String 类的内容不能被修改的这个不足之处,StringBuffer 类(又称字符缓冲区)表示的字符容器,其内容及长度可以被修改的,修改后不会产生新的 StringBuffer 对象.
<f② String 类覆盖了 Object 类的 equals() 方法,而 StringBuffer 类没有.
String s1 = "好好学习!";
String s2 = "好好学习!";
System.out.println(s1.equals(s2));
StringBuffer sb1 = new StringBuffer("天天向上!");
StringBuffer sb2 = new StringBuffer("天天向上!");
System.out.println(sb1.equals(sb2));
输出结果:
true
false
③ String 类可以通过 '+'号对两个 String 对象进行拼接,而 StringBuffer 类不可以.
String s1 = "好好学习,";
String s2 = "天天向上!";
System.out.println(s1 + s2); //输出结果:好好学习,天天向上!
StringBuffer sb1 = new StringBuffer("好好学习,");
StringBuffer sb2 = new StringBuffer("天天向上!");
System.out.println(sb1 + sb2); //此处报错