关于Java中intern()方法加载字符“java“时的问题

1、首先我们看一下intern()方法大致的功能

intern()方法是String类中的一个方法,并且是native方法,这意味这该方法应该是其他语言的实现,这里我们直接明说:它是底层调用C++中的 StringTable::intern方法实现的。
当某字符调用intern()的时候:如果常量池里面不存在该字符的引用,则将其引入常量池中,并返回这个对象的引用(string类型)
如果常量池里面存在该字符的引用,则直接返回这个对象的引用。

2、关于intern()中输出java字符时的问题

我们做两个测试:
在这里插入图片描述
大家觉得会是什么结果呢?结果如下:
在这里插入图片描述
这里出现了很奇怪的现象,58tongcheng字符没有任何问题,但是当我们输出java的时候,出现了问题。
很明显,第二个测试时两次输出的java字符并不是同样的字符,通过intern()输出的java字符是不一样的。
这里有个问题,是否是包括java,有一类或好几类的字符都会出现该问题,还是说只有java这个字符比较特殊,只有通过intern()返回java字符时,才会出现该问题呢?答案是:java 这个字符确实比较特殊,只有这一个字符有问题。
并且
jdk1.8的输出答案是true和false。

jdk1.6的输出是两个false。

String常量池中其实含有java字符

jdk1.8在初始化的时候就会自带一个java字符串,在加载sun.misc.Version这个类的时候就会进入常量池,所以我们的intern()发现池子里面有java字符,他就直接把jdk自带的这个java给返回了,并没有返回我们自己写的java字符,这当然不是同一个字符,所以判断的时候就会返回false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值