本文共 1561 字,大约阅读时间需要 5 分钟。
1.new String时是在堆上创建字符串对象,同时在常量池创建值一样的对象,但是这两个对象互不相干,如果常量池里已经有了同样的值的对象,只会在堆里新建对象
2.通过字面量复制创建字符串(如:String str=”twm”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。
3.调用 intern() 方法时,intern方法会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用如果在常量池找不到对应的字符串,就在常量池中生成一个对原字符串的引用。
st4 = new string(“a”)+new string(“b”); st5=st4.intern() 此时还是会在常量池里生成一个ab,即使原来已经有ab了,此时生成的ab指向st4的内存地址4.常量字符串的“+”操作,编译阶段直接会合成为一个字符串。如string str=”JA”+”VA”,在编译阶段会直接合并成语句String str=”JAVA”,于是会去常量池中查找是否存在”JAVA”,从而进行创建或引用。
5.常量字符串和变量拼接时或者变量与变量拼接时会调用stringBuilder.append()在堆上创建新的对象,而不会同时在常量池里新建对象
String str1 = “哈哈”
String str2=str1+“呵呵” String str3=“哈哈呵呵” System.out.println(str2 == str3); false常见试题解答
有了对以上的知识的了解,我们现在再来看常见的面试或笔试题就很简单了: Q:下列程序的输出结果: String s1 = “abc”; String s2 = “abc”; System.out.println(s1 == s2); A:true,均指向常量池中对象。Q:下列程序的输出结果:
String s1 = new String(“abc”); String s2 = new String(“abc”); System.out.println(s1 == s2); A:false,两个引用指向堆中的不同对象。Q:下列程序的输出结果:
String s1 = “abc”; String s2 = “a”; String s3 = “bc”; String s4 = s2 + s3; System.out.println(s1 == s4); A:false,因为s2+s3实际上是使用StringBuilder.append来完成,会生成不同的对象。Q:下列程序的输出结果:
String s1 = “abc”; final String s2 = “a”; final String s3 = “bc”; String s4 = s2 + s3; System.out.println(s1 == s4); A:true,因为final变量在编译后会直接替换成对应的值,所以实际上等于s4=”a”+”bc”,而这种情况下,编译器会直接合并为s4=”abc”,所以最终s1==s4。Q:下列程序的输出结果:
String s = new String(“abc”); String s1 = “abc”; String s2 = new String(“abc”); System.out.println(s == s1.intern()); System.out.println(s == s2.intern()); System.out.println(s1 == s2.intern()); A:false,false,true。转载地址:http://nuowi.baihongyu.com/