String类中intern()方法作用以及存在意义

结论:

String类中的intern()方法:
当调用intern方法时,不管使用什么方式定义一个字符串,都会首先在常量池中查找是否有相应的字符串存在,如果有,直接返回引用(指向该字符串的地址),否则,在常量池中生成相应的字符串并返回引用。
案例1:

String str1 = "app";
String str2 = new String("app");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));

结果:

false
true

案例2:

String str1 = "app";
String str2 = new String("app").intern();;
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));

结果:

true
true

由此可见调用intern()方法生成的对象,并没有生成新的空间存放”app“字符串

论证

案例解读

《深入理解java虚拟机》中有这样一段代码:

String str1=new StringBuilder("计算机").append("软件").toString();
System.out.println(str1);
System.out.println("str1.intern()==str1:" +(str1.intern()==str1));
String str2=new StringBuilder("ja").append("va").toString();
System.out.println(str2);
System.out.println("str2.intern()==str2:" + (str2.intern()==str2));
System.out.println("str2.intern()==\"java\" : " + (str2.intern()=="java"));

结果如下(示例):

计算机软件
str1.intern()==str1 : true
java
str2.intern()==str2 : false
str2.intern()=="java" : true

由于jvm内存中的常量池本身存在 “java”,因此str2.intern()==str2 为 false。

验证

案例:

String str01 = new StringBuilder("lo").append("ve").toString();
System.out.println(str01);
System.out.println("str01.intern()==str01 : " + (str01.intern()==str01));
String str02 = new StringBuilder("我爱").append("中国").toString();
System.out.println(str02);
System.out.println("str02.intern()==str02 : " + (str02.intern()==str02));
String str03 = new StringBuilder("1314").append("520").toString();
System.out.println(str03);
System.out.println("str03.intern()==str03 : " + (str03.intern()==str03));

结果如下:

love
str01.intern()==str01 : true
我爱中国
str02.intern()==str02 : true
1314520
str03.intern()==str03 : true

由此可见,数字、中文、字母由intern()方法创建后,都不会再在内存池新生成一个新的空间,"java"字符串只是个例。


结论

当调用intern方法时,不管使用什么方式定义一个字符串,都会首先在常量池中查找是否有相应的字符串存在,如果有,直接返回引用,否则,在常量池中生成相应的字符串并返回引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值