java中intern,JAVA中String的intern方法

JAVA字符串

JAVA中会经常用到字符串,字符串存放与字符串常量池。同一个字符串常量,在常量池只有一份副本。

通过双引号声明的字符串,直接保存在常量池。

如果是String对象,可以通过String.intern方法,把字符串常量保存到常量池。

JAVA中关于intern的面试题

String s = new String("rumenz.com");

s.intern();

String s2 = "rumenz.com";

System.out.println(s == s2);

String s3 = new String("rumenz") + new String(".com");

s3.intern();

String s4 = "rumenz.com";

System.out.println(s3 == s4);

结果

JDK1.6以及以下:false false

JDK1.7以及以上:false true

结果分析

① JDK1.6中将字符串常量存放于永久带的常量池中。永久带和堆是物理隔离的。当调用s.intern()时,如果常量池不存在"rumenz.com" ,就直接在永久带创建一个"rumenz.com"

② JDK1.7中字符串常量池在堆中。当调用s.intern()时,如果常量池不存在"rumenz.com",直接存储堆中的引用。

String s = new String("rumenz.com"); //生成常量池中的"rumenz.com"和堆中的字符串对象

s.intern(); //先查常量池存不存在"rumenz.com",如果不存在就生成"rumenz.com",jdk1.6和jdk1.7有区别 ① ②

String s2 = "rumenz.com"; //直接在常量区生成"rumenz.com"

System.out.println(s == s2);

String s3 = new String("rumenz") + new String(".com");

//常量区分别生成"rumenz"和".com",堆区生成s3对象,值为"rumenz.com",注意此时常量区并没有"rumenz.com"

s3.intern();//常量区生成"rumenz.com"

String s4 = "rumenz.com"; //jdk1.6直接返回"rumenz.com" ,jdk1.7后则返回对s3的引用

System.out.println(s3 == s4);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值