Java:String的不可变性理解以及存储问题

    科技2022-08-21  117

    首先什么是String,其名为字符串(在c里没有,c++有),注意String不是基本数据类型,是引用类型(类),也就是说String str储存的是地址值,但当我们打印一个String时返回的却是一个字符串,这是因为打印时默认调用str的toString方法。

    String str = "abc"; System.out.println(str); System.out.println(str.toString()); //两行结果一样

    返回值都是abc

    String不可变性

    String的不可变性,String内部是由char[]组成的所以当String对象被创建时,数组长度就已确定无法改变,只能用另一个char[]替换,所以说String是不可变的,那么来看:

    String str1 = "abc"; String str2 = "bcd"; str1 = str2; System.out.println(str1); System.out.println(str1 == str2);

    //output bcd true

    true表示两者地址相等,正如上述的说的替换。但其中还有很多问题

    //....... str1 = new String("bcd"); System.out.println(str1); System.out.println(str1 == str2);

    //output bcd false 这里又出现了false,证明两个地址不同,那到底String底层是如何实现的呢?

    不如让我们从头开始

    String str1 = "abc"; String str2 = "bcd";

    通过字面值创建的String对象

    (从内存层面来看)在使用字面值来创建String时,编译器会在静态方法区(字符串常量池)里寻找是否已经存在字面值(这里是abc 和bcd)如果没有就会在静态方法区(字符串常量池)里创建,并为我们的str1 str2 赋值(将abc的地址赋给str1,同理str2) 然后

    str1 = str2;

    ``

    通过new 创建的String对象

    str1 = new String("bcd");

    不难看出str1此时的值不再是”bcd”的地址值,而是在堆中那个char[]的值,所以此时str1 != str2;

    再进一步

    str2 = new String("bcd"); System.out.println(str1 == str2);

    //output false

    所以此时str1 != str2

    如果其中有错误欢迎各位指点

    最后(看一眼孤独的abc) 预告一下下期String的加法

    Processed: 0.020, SQL: 9