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

相关推荐

点赞 6 评论
分享
牛客网
牛客企业服务