zkskyers 2022-07-07 13:11 采纳率: 50%
浏览 25
已结题

Java 字符串常量池相关

代码如下,请问为啥会是这种情况?

public class Main {
    public static void main(String[] args) {
        test1();
        test2();
    }

    public static void test1() {
        String x = "x";
        String y = "y";
        String a = x + y;

        String c = a.intern();
        String b = "xy";

        System.out.println(a == c); //输出true
    }

    public static void test2() {
        String x = "x";
        String y = "y";
        String a = x + y;

        String b = "xy";
        String c = a.intern();

        System.out.println(a == c); //输出false
    }
}

输出如下:

true
false
  • 写回答

1条回答 默认 最新

  • 皮蛋不吃粥 2022-07-07 13:39
    关注

    简单说下吧
    String.intern() 就是手动把对象放进常量池中
    说明下这个解释是针对于JDK8,7和8还是有区别的

    方法一

      String a = x + y //字符串拼接 在堆中
      String c = a.intern(); //c是 "xy"放进常量池中,应用堆中对象地址
      String b = "xy"; //拿常量池中和c一样 指向堆中xy对象地址。
     
      System.out.println(a == c); //true,c虽然是来自常量池引用还是堆中xy对象地址。
    
    

    方法二

    public static void test2() {
            String x = "x";
            String y = "y";
            String a = x + y;//a是堆中xy地址
     
            String b = "xy"; //常量池中xy
            String c = a.intern();//"xy"是否已经在常量池中存在,存在,拿常量池xy地址 c是常量池xy地址
     
            System.out.println(a == c); //输出false a是堆中 c是常量池 false
        }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月19日
  • 已采纳回答 7月11日
  • 修改了问题 7月7日
  • 修改了问题 7月7日
  • 展开全部