`
lg_asus
  • 浏览: 184311 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java String.intern()

阅读更多
在看《深入理解Java虚拟机》第二章中有如下代码:
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);

在不同的jdk上面运行产生不同的结果。
在openjdk 1.8上面运行结果是true/true。
这里不纠结不同jdk运行的结果不同,只谈谈String.intern()方法的机制。
new StringBuilder("计算机").append("软件")
这段代码在执行的时候就会产生2个字符串"计算机"和"软件"并放入string pool中,因此"计算机软件".intern()的时候由于string pool中没有"计算机软件"这个字符串,根据intern()的定义:如果string pool中存在(equals)这个字符串,则返回string pool中的字符串引用,如果不存在,把这个字符串(复制一份)放入string pool并返回这个字符串引用。因此str1.intern() == str1结果就是true。
str2.intern()时候由于string pool中已经存在"java"这个字符串(作者周志明的解释),因此他说返回结果是false,但是在我的机器上返回结果却是true,可能openjdk 1.8里"java"这个字符串并不存在于string pool中 这里不纠结这个。
String str1 = "str1";//字符串常量直接复制一份到string pool
		System.out.println(str1.intern() == str1);//true
		
		String str2 = "str" + "2";//编译时会优化成"str2"
		System.out.println(str2.intern() == str2);//true
		
		String str3 = new String("str3");//这个时候"str3"是字符串常量,已经进入string pool
		System.out.println(str3.intern() == str3);//false
		
		String str3_2 = new String("str") + new String("3");
		System.out.println(str3_2.intern() == str3_2);//false;上面2个字符串str和3是常量,已经放入到string pool,并且"str3"也已经在string pool了(参见前面str3变量)
		
		String str4 = new String("str") + new String("4");
		System.out.println(str4.intern() == str4);//true;这个就不解释了
		
		String str5 = new StringBuilder("str5").toString();//"str5"是字符串常量,已经存入了string pool
		System.out.println(str5.intern() == str5);//false;
		
		String str6 = new StringBuilder("str").append("6").toString();
		System.out.println(str6.intern() == str6);//true;和str4变量一样

上面这些代码运行在openjdk1.8上。
也可以通过javap反编译查看,目前还不会看jvm 指令,以后再研究。
分享到:
评论

相关推荐

    String.intern – 字符串池

    这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。

    深入理解JavaString#intern()内存模型Ja

    深入理解JavaString#intern()内存模型Java开发Java经验技巧共4页.pdf.zip

    深入理解 Java String#intern() 内存模型.docx

    深入理解 Java String#intern() 内存模型.docx

    关于java String中intern的深入讲解

    主要给大家介绍了关于java String中intern的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    String类的intern、split方法

    java中String类的intern、split方法的详细讲解。

    深入理解Java String#intern()内存模型

    大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,会在字符串常量池中创建该字符串然后再返回。  字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, ...

    浅谈Java String内幕(下)

     String.intern()是一个Native方法,底层调用C++的 StringTable::intern 方法,源码注释:当调用 intern 方法时,如果常量池中已经该字符串,则返回池中的字符串;否则将此字符串添加到常量池中,并返回字符串的...

    提高Java代码性能的各种技巧

    Java 6,7,8中的String.intern–字符串池  这篇文章将要讨论Java 6中是如何实现String.intern方法的,以及这个方法在Java 7以及Java 8中做了哪些调整。  字符串池  字符串池(有名字符串标准化)是通过使用的...

    java面试题122道基础题

    欢迎大家下载java面试题,收集的一些面试方面的题 public static void main(String[] args) { String s=new String("abc"); System.out.println(s); String s1="abc"; String s2=new String("abc"); System....

    Test24StringInConstantsPool.java.zip

    String.intern 同一个字符串返回不同的引用 里面提及的 2021.11.21 部分内容修正 的测试用例

    Java String的intern用法解析

    主要介绍了Java String的intern用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java String的intern方法

    本文主要介绍java 中String 的intern方法,这里主要通过实例来说明不同版本的JDK,intern方法的对比,有需要的小伙伴可以参考下

    string常量池和intern_韩雅茹Java系列2021.pdf

    string常量池和intern_韩雅茹Java系列2021.pdf

    不同jdk版本下对String的intern()的分析.pos

    pos文件是ProcessOn的源文件,可以导入后直接打开编辑。 内容是:不同jdk版本下对String的intern()的分析

    Java核心基础+Java中的数据在内存中的存储

    1、内存中的堆(stack)与栈(heap) 2、Java中数据在内存中的存储 基本数据类型的存储 对象的内存模型 包装类数据的存储 String类型数据的存储...4、String.intern() 5、关于equasl()与== 6、关于String是不可变的

    阿-朗最新java面试题

    1、 String这个类型特殊性?...String.intern()方法作用? 2、 Factory 和抽象factory 的区别? 3、 解释一下java 对象的生命周期? 4、 |与|| 的区别和共同点? 5、 解释Java 反射机制?

    Big-Data-Interview:大数据面试知识点

    Big-Data-InterviewJava开发、大数据...封装、继承和多态Java语言数据类型Java的自动类型转换,强制类型转换String的不可变性、虚拟机的常量池中的String字符串、String.intern()的底层原理Java语言中的关键字:finalJa

    stringwrappers:包装器的字符串运算

    默认情况下,Java为每个String操作创建新的String。 子字符串是新分配的字符串。 在大多数情况下,这是最好的方法。 有时仅包装原始String可能会有所帮助。 我的项目就是这样。 主要是出于教育目的。 实际上,这可能...

    [jvm]深入JVM(一):从

    java解析CONSTANT_String_info时,java虚拟机必须把一个字符串对象的引用,放到constant pool entry 中。每个java虚拟机维护着一张列表,里面有所有程序被"interned"的字符串对象的引用。 查看constPoolOop.cpp文件 ...

    字符数组的存储方式 字符串常量池.docx

    字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的...

Global site tag (gtag.js) - Google Analytics