详解String类中的intern()方法

时间:2022-12-12 21:47:22

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

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类中被初始化

详解String类中的intern()方法

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

详解String类中的intern()方法

详解String类中的intern()方法

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

详解String类中的intern()方法的更多相关文章

  1. Java String类中的intern()方法

    今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法.所以今天看了一下.个人觉得给String类中加入这个方法可能是为了提升一点点性能 ...

  2. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  3. String类中的equals()方法:

    String类中的equals()方法: public boolean equals(Object anObject) { //如果是同一个对象 if (this == anObject) { ret ...

  4. Java用代码演示String类中的以下方法的用法

    用代码演示String类中的以下方法的用法 (1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true (2)char charAt(int index): 返回索引上 ...

  5. String类中一些的方法的应用

    一.整理string类 1.Length():获取字串长度: 2.charAt():获取指定位置的字符: 3.getChars():获取从指定位置起的子串复制到字符数组中:(它有四个参数) 4.rep ...

  6. String类中的equals()方法

    在Java中,每一个对象都有一个地址空间,在这空间保存着这个对象的值. equals 比较的是值,==比较的地址以及值. 01: public class StringExample02: {03: ...

  7. String类中常用的方法(重要)

    1.字符串与字节 public String(byte[] byte); 将全部字节变成字符串 public String (byte[] byte,int offset,int length) 将部 ...

  8. String类中的toCharArray()方法

    toCharArray()方法  该方法的作用是返回一个字符数组,该字符数组中存放了当前字符串中的所有字符 public class toChar1{ public static void main( ...

  9. String类中常用的方法

    @Test public void demo(){ // 以下为String中的常用的方法及注释, 最常用的注释前有**标注 String s = "abcdefg123456"; ...

随机推荐

  1. 我是如何把VC6一直用到2016年的

    写下这个标题的时候,也是表明必须需要改变的时候了…… 黄山松 (Tom Huang) 发表于博客园http://www.cnblogs.com/tomview/ 最早从windows3.1使用vb3编 ...

  2. python 实现 斐波那契数列

    #!usr/bin/python#_*_coding=utf-8_*_ def fin(n): li=[0,1] for i in range(2,n): li.append(li[-1]+li[-2 ...

  3. proc_dir_entry

    struct proc_dir_entry {        unsigned int low_ino;        unsigned short namelen;        const cha ...

  4. 源代码管理工具TFS2013安装与使用

    最近公司新开发一个项目要用微软的TFS2013进行项目的源代码管理,以前只是用过SVN,从来没有用过TFS,所以在网上百度.谷歌了好一阵子来查看怎么安装和配置,还好花了一天时间总算是初步的搞定了,下面 ...

  5. delphi新语法之泛型实现的对象池模板

    现在的DELPHI因为支持泛型的语法,所以也能支持模板编程了.   // 标准模板 unit UntPools;   interface   uses   Classes, SysUtils, Unt ...

  6. win10 mysql详尽安装教程

    我的电脑系统是win10 64位系统 我安装mysql不下5次,装好了又卸,卸了又装,看了老多篇文章和博客,非常感谢博主的无私帮助,以下是这些博主的文章: https://www.cnblogs.co ...

  7. SpringCloud应用入库后乱码问题

    一.现象 1.请求 2.入库后 二.解决过程 1.配置application.properties 2.代码配置 3.数据库(关键!!) 3.请求 三.验证过程 1.win10 - 本地验证通过 2. ...

  8. [LeetCode] Clone Graph 克隆无向图

    Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph ...

  9. win10下SVN图标不显示

    win10系统的SVN图标不现实了.正常情况下,会在文件夹上有一个对勾 但是对勾以及所有的SVN图标都突然消失了,都不知道文件什么状态了. 经过一通搜索,发现问题所在(都指向注册表图标被占用).原因就 ...

  10. 004-linux命令-搜索命令find、locate、whereis、which、type

    一.概述 使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索. 1.1.find 语法:find <指定目录> <指定条件> <指定动作& ...