简单的总结一下我所知道的字符串不可变性的知识
对于字符串,大家并不陌生,
字符串可以通过以下两种方式创建
String str = new String("abc");
String str1 = "abc";
那么两种创建方式是否有区别呢?
首先我们需要知道在jdk8之后,字符串都将存放在方法区内的字符串常量池中,在String数据类型的底层是用一个final修饰的字符数组来存取数据的,一经赋值,就不可改变,这也就是String的不可变性的由来。上述的创建过程可以由下图来表示:
在使用new创建一个字符串对象时,我们先是在堆空间里创建了一个对象,并且将该对象的地址值赋值给str,与此同时在字符串常量池中也创建了一个对象,也就是存放abc的数组,并且将该对象的地址值赋值给堆空间中的对象。而当我们使用字面量的方式再创建字符串"abc"时,字符串常量池中的"abc"对象将会重复使用,直接将其地址值赋值给str1。
此外,如果再运行下面代码:
str1 = str1 + "d";
由于字符串的不可变性,并不会在原字符串"abc"上修改,此时将会在字符串常量池中创建一个新的对象,如下图所示:
在如下的一些题目中,出现以下结果,就可以用上述知识分析:
String s1 = new String("abc");
String s2 = "abc";
String s3 = "abcabc";
String s4 = new String("abc");
String s5 = s2+s4;
判断: s1 == s2; //false
s1 == s4; //false
s5 == s3; //true