• 详解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”在之前就已经被加入到了常量池中。

  • 相关阅读:
    Android 自定义View手写签名并保存图片
    快速定位iOS线上BUG在哪个控制器崩溃
    最简单的iOS网络请求
    ButterKnife的安装与使用以及ButterKnife右键不显示的大坑
    安卓两个build.gradle的区别
    苹果电脑获取Android Studio的发布版SHA1和开发版SHA1
    AppStore下载Xcode的文件
    webp转png或jpg
    让Xcode日志输出中文
    iOSPush自动隐藏tabbar
  • 原文地址:https://www.cnblogs.com/moster/p/8352016.html
Copyright © 2020-2023  润新知