String字符串中 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)上面说到,堆中存在一个new String() 对象和字符串常量池中的字符串对象还不一样?
(2)为什么还要分jdk 1.6 和jdk 1.7及以后呢?

答:两个位置的字符串对象肯定是不一样的,我们都知道jdk 1.6时字符串常量池还在永久代(那时候叫永久代)中, 在jdk 1.7 及之后字符串常量池和静态变量就放到了堆中。堆中的字符串对象创建一般都是在eden(伊甸园)中创建的,而字符串常量池虽然也在堆中,但它们两压根就不是在一个内存区域中。对这些知识还不了解的,可以去看看我的另一些文章,里面很详细的说明了这些。

4、如何保证变量S指向的是字符串常量池中的数据呢?

方法一:String s = “hello”;//字面量定义的方式
方式二:String s = new String (“hello”).intern();
以及这种String s = new StringBuilder(“hello”).intern();

还没完,来看一道intern经典的面试题,试试吧!

另外:我还写了一篇关于String字符串的详细文章。

有用点个关注,手留余香!😐 😐 😐

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值