您的位置:首页 > 编程语言 > Java开发

通过反编译深入理解Java String及intern

2017-10-08 23:54 507 查看

参考:

1,通过反编译深入理解Java String及intern

http://www.importnew.com/21024.html#comment-577875

2,Java8内存模型—永久代(PermGen)和元空间(Metaspace)

http://www.cnblogs.com/paddix/p/5309550.html

3,String 和 new String()的区别

https://www.geek-share.com/detail/2648470646.html

常见面试题解答

有了对以上的知识的了解,我们现在再来看常见的面试或笔试题就很简单了:

Q:String s = new String(“xyz”),创建了几个String Object?

A:两个,常量池中的”xyz”和堆中对象。

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,具体原因参考(通过反编译深入理解Java String及intern)第二部分内容。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: