string本质是一个不可变的字符数组--private final char value[].
string是一个字符串的类,所有的字符串都是它的对象.
例子1:string s1="abc"
string s1="aaa";其实是在常量池里创建了一个"aaa"的string类的对象.它的地址记录的是常量池里的内存地址.
例子2:string s1="a"+"b"+"c"
String s1 = "a" + "b" + "c”; 在编译的时候就编程了abc
String s2 = "abc";
System.out.println(s1 == s2); true
System.out.println(s1.equals(s2)); true
java 中有常量优化机制。
例子3:string s1=new string("abc" )
string s1=new string("abc" );其实是在常量池里创建了一个"abc"的string类的对象,并且又在堆内存里创建了一个"abc"的string类的对象.但是它的内存地址记录的是堆内存里的地址.
常量池的字符串对象是可以共用的.但是堆内存的字符串对象是各用各的.
例子4:string s1="ab",string s3=s1+"c"
string s3=s1+"c"实际上是执行了string s3=(new StringBuilder(s1)).append(c).toString();
前后实际在堆内存产生了一个内容为"abc"的StringBuilder类的对象和一个内容为"abc"的string类的对象,又在常量池产生了一个内容为"abc"的string类的对象.
stringbuilder也会在常量池产生对象吗?这个后面再研究补充