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

Posted smallji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过反编译深入理解Java String及intern相关的知识,希望对你有一定的参考价值。

参考:

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()的区别

http://blog.csdn.net/u012925323/article/details/46989201

常见面试题解答

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

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)第二部分内容。

以上是关于通过反编译深入理解Java String及intern的主要内容,如果未能解决你的问题,请参考以下文章

深入分析Java的编译原理

3Scala源文件的编写和运行及编译结果的反编译深入分析(单例设计模式)

深入理解PHP Phar反序列化漏洞原理及利用方法

Java基础3:深入理解String及包装类

Serializable深入理解

Java基础3:深入理解String及包装类