话说,黛玉跟宝钗去一家公司面试,面试官都问了他们有关String类的问题
- 面试官:什么是字符串常量池?
- 黛玉:jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。
- 面试官:那有版本的区别吗?
- 黛玉:字符串常量池的位置也是随着jdk版本的不同而位置不同。在jdk6中,常量池的位置在永久代(方法区)中,此时常量池中存储的是对象。在jdk7中,常量池的位置在堆中,此时,常量池存储的就是引用了。在jdk8中,永久代(方法区)被元空间取代了。
- 面试官:可以举个例子吗?
- 黛玉:沉思中...
- 黛玉:不懂就宝钗一下吧
- 宝钗:String用=new和=“xx”不一样,1.如果这个字符串还没创建,那么都是先在堆中创建一个实例对象,然后在常量池中存储引用值,但是这里的指向就不同了,前者的引用是指向实例对象,后者是指向常量池;2.如果字符串已经创建,那么前者依然会创建一个实例对象,然后引用指向它,但是第二种情况只引用指向常量池的值
String a = new String("123");
String b = a.intern();
String c = "123";
又是宝黛的面试一天
引用如下:
1.https://www.javalearn.cn/#/doc/Java%E5%9F%BA%E7%A1%80/%E9%9D%A2%E8%AF%95%E9%A2%98?id=%e4%bb%80%e4%b9%88%e6%98%af%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%b8%b8%e9%87%8f%e6%b1%a0%ef%bc%9f
2.https://blog.csdn.net/qq_42391503/article/details/107779191
#牛客解忧铺##悬赏#