Android中的java基础(三)——String的不可变性

来源:互联网 发布:网站运营数据 编辑:程序博客网 时间:2024/05/29 11:07

那么先开始讲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个不同的对象。





1 0
原创粉丝点击