在看《深入理解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 指令,以后再研究。
分享到:
相关推荐
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。
深入理解JavaString#intern()内存模型Java开发Java经验技巧共4页.pdf.zip
深入理解 Java String#intern() 内存模型.docx
主要给大家介绍了关于java String中intern的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
java中String类的intern、split方法的详细讲解。
大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,会在字符串常量池中创建该字符串然后再返回。 字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, ...
String.intern()是一个Native方法,底层调用C++的 StringTable::intern 方法,源码注释:当调用 intern 方法时,如果常量池中已经该字符串,则返回池中的字符串;否则将此字符串添加到常量池中,并返回字符串的...
Java 6,7,8中的String.intern–字符串池 这篇文章将要讨论Java 6中是如何实现String.intern方法的,以及这个方法在Java 7以及Java 8中做了哪些调整。 字符串池 字符串池(有名字符串标准化)是通过使用的...
欢迎大家下载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....
String.intern 同一个字符串返回不同的引用 里面提及的 2021.11.21 部分内容修正 的测试用例
主要介绍了Java String的intern用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本文主要介绍java 中String 的intern方法,这里主要通过实例来说明不同版本的JDK,intern方法的对比,有需要的小伙伴可以参考下
string常量池和intern_韩雅茹Java系列2021.pdf
pos文件是ProcessOn的源文件,可以导入后直接打开编辑。 内容是:不同jdk版本下对String的intern()的分析
1、内存中的堆(stack)与栈(heap) 2、Java中数据在内存中的存储 基本数据类型的存储 对象的内存模型 包装类数据的存储 String类型数据的存储...4、String.intern() 5、关于equasl()与== 6、关于String是不可变的
1、 String这个类型特殊性?...String.intern()方法作用? 2、 Factory 和抽象factory 的区别? 3、 解释一下java 对象的生命周期? 4、 |与|| 的区别和共同点? 5、 解释Java 反射机制?
Big-Data-InterviewJava开发、大数据...封装、继承和多态Java语言数据类型Java的自动类型转换,强制类型转换String的不可变性、虚拟机的常量池中的String字符串、String.intern()的底层原理Java语言中的关键字:finalJa
默认情况下,Java为每个String操作创建新的String。 子字符串是新分配的字符串。 在大多数情况下,这是最好的方法。 有时仅包装原始String可能会有所帮助。 我的项目就是这样。 主要是出于教育目的。 实际上,这可能...
java解析CONSTANT_String_info时,java虚拟机必须把一个字符串对象的引用,放到constant pool entry 中。每个java虚拟机维护着一张列表,里面有所有程序被"interned"的字符串对象的引用。 查看constPoolOop.cpp文件 ...
字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的...