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