[java基础]常见类之String内存分析

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实际上指向的就是同一块区域。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值