首先我觉得要看懂这道题还得知道inren()方法的一些知识,还要知道new String(“ab”)到底创建了几个对象。
一、intern()方法的理解(重难点)
1、intern()是字符串对象的一个方法,它底层是一个native直接是调用了本地方法
2、调用这个方法之后就是去看当前字符串是否在常量池中存在
(1)存 在:那就直接返回该字符串在字符串常量池中所对应的地址给栈中要引用这个字符串的变量。
(2)不存在:
① jdk 1.6:先在字符串常量池中创建该字符串,地址与堆中字符串地址不相同。然后再返回刚创建的字符串在字符串常量池中所对应的地址给栈中要引用这个字符串的变量。
② jdk 1.7及以后:直接将堆中(不是字符串常量池中)该字符串的地址复制到字符串常量池中,这样字符串常量池就有了该字符串的地址引用,也可以说此时字符串常量池中的字符串只是一个对 堆中字符串对象的引用,它们两个的地址相同,然后再把这个地址返回给栈中要引用这个字符串的变量。
可能你已经懵了,但是上面这句话你理解了,那么之后的intern()方法相关的面试题可以说都不在话下了,下面有一个面试题。
如果不是用双引号直接声明的String对象,可以使用String 提供的intern 方法:intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。例如:String str = new String( “I love me ?”) . intern();
jdk 1.7 分析:首先上面这个str会进栈,然后会在堆中创建一个 new String()对象,再把这个对象在堆中的地址复制给字符串常量池中,最后再将常量池中的该字符串地址引用到栈中str。
通俗点讲,intern String 就是确保字符串在内存里有一份拷贝,这样可以节约内存空间,加快字符串操作的任务的执行速度,注意,这个值会被存放在字符串内部池中。也就是 (“a” + “b” + “c”). intern() == “abc” // ture
3、对第二小点里面部分概念解释
(1)上面说到,