那么先开始讲String String 对象的不可变性,例如
String a = "1";
a = "2";
这时候实际内存是存在"1",“2”这两个对象,具体的位置是在文字池(pool of literal strings),运行文字池其实是常量池的一部分。
可以理解为每次String改变,并不是改变了此对象,而是重新建立了一个新的对象。而StringBuilder与StringBuffer可以在原始对象上进行变化更改。
例如一下代码:
//测试String型是否相同
String mString2a ="2";
String mString2b = "2";
String mNewString2a = new String("2");
String mNewString2b = new String("2");
System.out.println("(mString2a==mString2b) -->"+(mString2a==mString2b));
System.out.println("(mString2b==mNewString2a)-->"+(mString2b==mNewString2a));
System.out.println("(mNewString2a==mNewString2b) -->"+(mNewString2a==mNewString2b));
我们变量命名规则依然是m+是否new+对象类型+数值+区别符,以下是运行结果
(mString2a==mString2b) -->true //这个验证了都是指向文字池的两个不同的变量,他们的文字内容一致,我们通过==等号盘点,他们指向了同一个地方。
(mString2b==mNewString2a)-->false //这里虽然值相等,但是mNewString2a指向了一个堆区对象,两个变量直接通过等号无法判等。
(mNewString2a==mNewString2b) -->false
//这里虽然值也相等,但是mNewString2a与mNewString2a指向了堆区不同的对象,两个变量直接通过等号无法判等堆区地址。
对于mString2a可以理解如果文字池没有"2"的时候,则会创建一个对象"2",之后mString2b不会再创建一个对象"2",而mNewString2a、mNewString2b则会分别在堆区创建一个对象,从而在刚刚的这个代码段的过程中,创建了最多3个不同的对象。