首先什么是String,其名为字符串(在c里没有,c++有),注意String不是基本数据类型,是引用类型(类),也就是说String str储存的是地址值,但当我们打印一个String时返回的却是一个字符串,这是因为打印时默认调用str的toString方法。
String str = "abc"; System.out.println(str); System.out.println(str.toString()); //两行结果一样返回值都是abc
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时,编译器会在静态方法区(字符串常量池)里寻找是否已经存在字面值(这里是abc 和bcd)如果没有就会在静态方法区(字符串常量池)里创建,并为我们的str1 str2 赋值(将abc的地址赋给str1,同理str2) 然后
str1 = str2;``
不难看出str1此时的值不再是”bcd”的地址值,而是在堆中那个char[]的值,所以此时str1 != str2;
再进一步
str2 = new String("bcd"); System.out.println(str1 == str2);//output false
所以此时str1 != str2
如果其中有错误欢迎各位指点
最后(看一眼孤独的abc) 预告一下下期String的加法
