API说明部分:
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
测试1:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
String abc = "test1";
String bcd = "test2";
String t1 = abc + bcd;
String t2 = abc + bcd;
System.out.println(t1.equals(t2));
System.out.println(t1 == t2);
执行结果:true、false。
表明它们只是字面值相同,实际内存地址并不相同。
而且表明虚拟机不会自动替你完成把字符串加入到字符串常量池的功能。
在内存中,还是生成了两个对象。t1和t2
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
测试2:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
String abc = "test1";
String bcd = "test2";
String t1 = abc + bcd;
String t2 = abc + bcd;
System.out.println(t1.equals(t2));
System.out.println(t1 == t2);
t1.intern();
t2 = t2.intern();
System.out.println(t1.equals(t2));
System.out.println(t1 == t2);
执行结果:true、false、true、false
虽说t1执行了所谓的“扣留”操作,但是并未接受字符串常量池返回的引用对象,导致t1和t2实际的内存地址还是不一样的。
结论:intern()方法如果本身未接受池中返回的对象引用,方法不会更改对象的引用。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
测试3:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
String abc = "test1";
String bcd = abc;
bcd = bcd.intern();
System.out.println(abc == bcd);
虚拟机默认会把初始化声明的String对象注册到常量池中,当其它字符串.equals(abc)相等时,并调用intern()方法接收返回值,则两个对象的内存地址也将一样,因为引用的都是同一对象地址
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
基础知识,不容忽视!!!
分享到:
相关推荐
java中String类的intern、split方法的详细讲解。
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。
那么String.intern的性能怎么样呢?我们一起来看一下。 String.intern和G1字符串去重的区别 之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。 而G1垃圾回收器的字符串去重的功能其实和...
pos文件是ProcessOn的源文件,可以导入后直接打开编辑。 内容是:不同jdk版本下对String的intern()的分析
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...
主要给大家介绍了关于C#中字符串优化String.Intern、IsInterned的相关资料,文中通过示例代码介绍的,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
深入理解JavaString#intern()内存模型Java开发Java经验技巧共4页.pdf.zip
深入理解 Java String#intern() 内存模型.docx
主要给大家介绍了关于java String中intern的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
string常量池和intern_韩雅茹Java系列2021.pdf
主要介绍了Java String的intern用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本文主要介绍java 中String 的intern方法,这里主要通过实例来说明不同版本的JDK,intern方法的对比,有需要的小伙伴可以参考下
大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,会在字符串常量池中创建该字符串然后再返回。 字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, ...
A2:当一个String实例调 用 intern() 方法时,Java查找常量池中是否有相同Unicode 的字符串常量,如果有,则返回其的引用,如果没有,则在
String.intern()是一个Native方法,底层调用C++的 StringTable::intern 方法,源码注释:当调用 intern 方法时,如果常量池中已经该字符串,则返回池中的字符串;否则将此字符串添加到常量池中,并返回字符串的...
主要介绍了通过String.intern()方法浅谈堆中常量池,在JDK7之前,字符串常量是存在永久带Perm 区的,JDK7开始在将常量池迁移到堆中,这个变化也导致了String的新特性,下面我们慢慢进行介绍。,需要的朋友可以参考下
//true}补充:String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是
在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;...