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日
  • 展开全部

悬赏问题

  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事: