关于String的内存分析——笔记整理

前两天碰到个关于字符串的问题,于是上网查了下资料,网上的大神果然很多,发现很多篇讲解的文章,自己学习之后消化成自己的东西重新梳理记录一遍。

	String s1 = "a";
	String s2 = "b";
	String s3 = "a" + "b";

s1、s2和s3都存在字符串常量池中;

	String s4 = new String("b");
	String s5 = new String("c");

s4会在堆中创建一个对象,s5会在堆中和字符串常量池中各创建一个;
详细说明:单独new出来的字符串,会首先在堆中创建一个对象,然后再查找常量池中是否有与该对象的值(即内容,使用equals比较)相等的字符串,如果有,则不创建,没有,则在字符串常量池中创建一个内容相等的字符串(注意:不是引用地址);

	String s6 = new String("a") + new String("b");
	String s7 = s1 + s2;

s6和s7只会在堆中创建对象,不会在常量池中创建对象;
详细说明:通过两个变量名相加得到的字符串以及通过两个或以上new出来的对象相加得到的字符串,只会在堆中重新创建一个对象,不会理会常量池中是否存在;

最后说下intern方法:

	String s8 = new String("a") + new String("bc");
	s8.intern();

此时,按照上述说明,s8只会在堆中创建一个对象,不会在常量池;
执行代码:s8.intern();
此时,s8将会查找常量池中是否存在"abc"(即使用equals查找内容为"abc"的字符串,个人理解,方便描述),如果存在,则不做任何操作,如果不存在,则将s8的引用(注意是引用地址)存放在字符串常量池中;

思考1:

String s9 = new String("bcd");
s9.intern();
String s10 = "bcd";
System.out.println(s9 == s10);// 输出什么?false

思考2:

String s11 = new String("g") + new String("hj");
s11.intern();
String s12 = "ghj";
System.out.println(s11 == s12);// 输出什么?true

思考3:

String s13 = new String("x") + new String("yz");
String s14 = "xyz";
s13.intern();
System.out.println(s13 == s14);// 输出什么?false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值