zoukankan      html  css  js  c++  java
  • 详解String类中的intern()方法

    我们用一个经典的例子来理解

    package com.jvm.heap;
    
    public class MyTest {
        public static void main(String[] args) {
            String str1 = new StringBuilder("计算机").append("软件").toString();
            System.out.println(str1.intern() == str1);
    
            String str2 = new StringBuilder("ja").append("va").toString();
            System.out.println(str2.intern() == str2);
    
            String str3 = new StringBuilder("1.8.0_111").toString();
            System.out.println(str3.intern() == str3);
    
            String str4 = new StringBuilder("ja").append("ee").toString();
            System.out.println(str4.intern() == str4);
    
        }
    }

    true
    false
    false
    true

    String中的intern()方法,这个方法要注意的是JDK 1.6中运行,会得到两个false,而JDK 1.7中运行,会得到一个true和一个false。产生的原因是:在JDK1.6中,intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符实例的引用,而由StringBuilder创建的字符串实例在Java堆上,所以必然不同一个引用,将返回false。而JDK1.7开始以后JVM 取消了永生代,取而代之的是元空间,所以intern()实现不会再复制实例,只是把常量池中记录首次出现的实例引用,因此intern()返回的引用和 StringBuilder创建的那个字符串实例是同一个,对str2 比较返回 false是因为“java”这个字符串在执行 StringBuilder.toString()之前就已经出现过。我们最后发现java这个字符串在System类中被初始化

    根据注释可以看出来,System是有虚拟机自动调用,在initializeSystemClass方法中发现调用了Version对象的init静态方法,而在Version类中可以找到私有静态字符串常量 java等

    所以可以说明“java”在之前就已经被加入到了常量池中。

  • 相关阅读:
    BZOJ.1034.[ZJOI2008]泡泡堂(贪心)
    BZOJ.4247.挂饰(背包DP)
    Codeforces.1040E.Network Safety(思路 并查集)
    LOJ.2863.[IOI2018]组合动作(交互)
    BZOJ.3624.[APIO2008]免费道路(Kruskal)
    BZOJ.4237.稻草人(CDQ分治 单调栈)
    BZOJ.3551.[ONTAK2010]Peaks加强版(Kruskal重构树 主席树)
    BZOJ.4946.[NOI2017]蔬菜(贪心 离线)
    BZOJ.2660.[BJOI2012]最多的方案(DP)
    BZOJ.3994.[SDOI2015]约数个数和(莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/moster/p/8352016.html
Copyright © 2011-2022 走看看