字符串常量池的坑知多少?

   日期:2020-05-07     浏览:87    评论:0    
核心提示:常量池有坑吗,下面我们用jdk1.8环境来看看怎么回事public static void mainjava

常量池有坑吗,下面我们用jdk1.8环境来看看怎么回事

public static void main(String[] args) {
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1.intern() == str1);
        System.out.println(str1 == "计算机软件");
  }
true
true
 public static void main(String[] args) {
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1 == "计算机软件");
        System.out.println(str1.intern() == str1);
    }
false
false

为什么只是调换顺序就会导致结果出现差异呢

所需知识:

首先来个知识压压惊:

jdk1.8以后,intern()的实现不会在复制实例,只是在常量池中记录首次出现的实例引用,因此返回的是引用和由StringBuilder.toString()创建的那个字符串实例是同一个。

好的,不够,再来个知识:

确定的字符串在编译期就已经在常量池存在引用

分析:
若第二行代码是 System.out.println(str1.intern() == str1);intern()的实现不会在复制实例,只是在常量池中记录首次出现的实例引用,ok,所有自然为true,接下来System.out.println(str1 == "计算机软件");"计算机软件"会去搜索常量池返回之前的引用,自然还是true

若第二行代码是 System.out.println(str1 == "计算机软件");确定的字符串在编译期就已经在常量池存在引用,运行时自然会将静态常量池加入到运行时常量池,也就是说出现"计算机软件"这种确定的字面量字符串,就会加入到字符串常量池,并返回引用,第一行的new StringBuilder.toString()只是对应着堆里面的对象引用,自然false,再执行str1.intern()也是返回的字符串常量池中"计算机软件"的引用,依然false

好了,有了上面的分析,大家看下下面两种情况又是什么样的结果呢?

  public static void main(String[] args) {
        String str1 = new String("计算机软件");
        System.out.println(str1.intern() == str1);
        System.out.println(str1 == "计算机软件");
    }
  public static void main(String[] args) {
        String str1 = new String("计算机软件");
        System.out.println(str1 == "计算机软件");
        System.out.println(str1.intern() == str1);
    }

常量池相关知识可以参考:

https://blog.csdn.net/xk4848123/article/details/105915340

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服