String的内存解析
1.
/*
* **String:代表不可变的字符序列。底层使用char[]存放。**
* **String 是final的。**
*/
@Test
public void test1(){
String str1 = "JavaEE";
String str2 = "JavaEE";
String str3 = new String("JavaEE");
String str4 = "JavaEE" + "Android";
String str5 = "Android";
String str6 = str1 + str5;
str5 = str5 + "Handoop";
String str7 = str6.intern();
String str8 = "JavaEEAndroid";
System.out.println(str1 == str2);//true
System.out.println(str1 == str3);//false
System.out.println(str1.equals(str3));//true
System.out.println(str4 == str6);//false
System.out.println(str4.equals(str6));//true
System.out.println(str7 == str4);//true
System.out.println(str4 == str8);//true
Person p1 = new Person("AA");
Person p2 = new Person("AA");
System.out.println("^_^"+ (p1.name == p2.name));//true
}
分析
String str1 = "JavaEE";
String str2 = "JavaEE";
System.out.println(str1 == str2);//true
如下图我们会发现str,str2在jvm的栈中地址相同且同指向一块区域。故自然两者相等:
分析:
String str1 = "JavaEE";
String str2 = "JavaEE";
String str3 = new String("JavaEE");
System.out.println(str1 == str3);//false
System.out.println(str1.equals(str3));//true
首先我来分析一下这个str3对象,它实际在Jvm中是生成了两个对象。1.是在堆中成生成了指向字符串常量池中具体内容的对象图中的(0x2233),也就是堆中现在存放的就是个地址(value=0x1234)。2.字符串常量池中存放的具体内容的对象(0x1234)。
如下图所示
生成了两个对象我们其实看String的源码就很容易知道
从源码中我们不难看出实际传进来的是个char数组,自然就是个地址。
所以str1于str3不相等,而str1.equals(str3)相等的原因就是因为equals比较的是其具体存放在字符串常量池中的内容。
分析:
String str4 = "JavaEE" + "Android";
String str6 = str1 + str5;
System.out.println(str4 == str6);//false
System.out.println(str4.equals(str6));//true
String str4 = “JavaEE” + “Android” , 将 “javaEEAndroid” 组合完成后 地址分配给 str4 其等同于 String str4 = “javaEEAndroid”
对于 String str6 = str1 + str5;
运行期JVM首先会在堆中创建一个StringBuilder类,同时用str1指向的字符串对象完成初始化,然后调用append方法完成对str5所指向的字符串的合并,接着调用StringBuilder的toString()方法在堆中创建一个String对象,最后将刚生成的String对象的堆地址存放在局部变量str6中。
故第一个为false,第二个为true不解释。
分析:
String str4 = "JavaEE" + "Android";
String str7 = str6.intern();
String str8 = "JavaEEAndroid";
System.out.println(str7 == str4);//true
System.out.println(str4 == str8);//true
这个相等的原因.intern获取的是具体内容比较,故第一个相等,第二个相等原因与上个分析是相同的。str4与str8实际上指向的就是同一块区域。