Java中String字符串的一些疑惑,求大佬解答

package com.gang.jav2;
 
public class StringDemo {
    public static void main(String[] args) {
        String str1=new StringBuilder("javv").append("aa").toString();
        System.out.println(str1);
        System.out.println(str1.intern());
        System.out.println(str1==str1.intern());
        System.out.println("====================");
        String str2=new StringBuilder("javv").append("aav").toString();
        String str3="javvaav";
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str2==str2.intern());
        System.out.println(str3==str2.intern());
        System.out.println("====================");
        String str4=new String("aabb");
        String str5="aabb";
        System.out.println(str5==str4.intern());
    }
}
 
=============================
output:
 
javvaa
javvaa
true
====================
javvaav
javvaav
false
true
====================
true

话不多说,先上代码;

str1==str1.intern() 这个相信熟悉字符串的同学应该能明白。

下面的str2==str2.intern() 结果是false,我就不能理解了.. 

这是为什么呢?

#Java##笔试题目#
全部评论
说错了 我重说一遍 intern的作用是 判断当前字符串是否在常量池中? 1、在的话,就直接返回常量池地址 2、不在的话,直接返回当前字符串的地址。 你的str1样例:常量池中有javv 和 aa。但是没有javvaa所以 判断的时候两次返回的都是堆中javvaa的地址,结果为tr ue。 你的str2样例:同理也是true 但是!!!你在判断之前,又加入了str3使得常量池出现了javvaav。所以判断为false。 所以,str1执行正确。str2由于你加了别的因素,导致结果出现问题。
3 回复 分享
发布于 2021-04-30 13:59
str2==str2.intern()返回false是因为,在调用str2.intern()方法时,方法区中已经有了“javvaav”字符串,那么str2.intern()就会返回方法区中字符串地址,而str2还是指向了堆中“javvaav”的地址,所以返回false。这也是为什么str3==str2.intern()返回的是true。
2 回复 分享
发布于 2021-04-30 10:35
str2.intern返回的是常量池的地址 str2是堆地址
点赞 回复 分享
发布于 2021-04-30 09:42

相关推荐

点赞 评论 收藏
分享
湫湫湫不会java:1.在校经历全删了2.。这些荣誉其实也没啥用只能说,要的是好的开发者不是好好学生3.项目五六点就行了,一个亮点一俩行,xxx技术解决,xxx问题带来xxx提升。第一页学历不行,然后啥有价值的信息也没有,到第二页看到项目了,第一个项目九点,第二个项目像凑数的俩点。总体给人又臭又长,一起加油吧兄弟
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务