摘要:概念是一个方法,它的作用是如果字符串常量池中已经包含了一个等于此对象的字符串,则返回代表池中这个字符串的对象否则,将此对象包含的字符串添加到常量池中,并且返回此对象的引用。中,字符串常量池是放在于永久代中的,这个是完全区分于堆内存的。
概念:
String.intern()是一个native方法,它的作用是:如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。
上述的黑体部分,在jdk1.6和1.7(含以上)中的表现形式是不同的。
1.jdk1.6中,字符串常量池是放在于永久代中的,这个是完全区分于堆内存的。intern()方法会把首次遇到的字符串实例复制一个到永久代中,返回的也是永久代中这个字符串实例的引用。
2.jdk1.7中,字符串常量池已经被放在了堆中,而intern()方法不会在复制实力,只是在常量池中记录首次出现的实例引用,因此对堆内存中的String引用使用intern()方法,常量池中并不会出现对应的字符串,而是指向了堆内存中的实例。
代码分析:
public class Test4 { public static void t1(){ //实例s1存在于堆内存中,常量池中并不存在该字符串“java” String s1 = new StringBuilder("mjp").append("cmm").toString(); //s1 intern会检查常量池是否有“mjpcmm”,这里不存在,所以直接在常量池中记录该引用,即s2指向了s1,所以s1==s2返回true String s2 = s1.intern(); System.out.println(s1 == s2);//这里打印出true } public static void t2(){ //先再字符串常量池中创建了mjpcmm这个常量,s保存对应常量池的引用地址 String s = "mjpcmm"; //实例s1存在于堆内存中,所以这里有两个引用,s指向常量池,s1则指向堆内存 String s1 = new StringBuilder("mjp").append("cmm").toString(); //s1 intern会检查常量池是否有“mjpcmm”,这里已经存在,所以直接返回该引用,即s2指向了s,所以s==s2返回true,s1==s2返回false String s2 = s1.intern(); System.out.println(s == s2);//这里打印出true System.out.println(s1 == s2);//这里打印出false } public static void main(String[] args) { // t1(); t2(); } }
欢迎加入学习交流群569772982,大家一起学习交流。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67688.html
摘要:为了减少在中创建的字符串的数量,字符串类维护了一个字符串常量池。但是当执行了方法后,将指向字符串常量池中的那个字符串常量。由于和都是字符串常量池中的字面量的引用,所以。究其原因,是因为常量池要保存的是已确定的字面量值。 String,是Java中除了基本数据类型以外,最为重要的一个类型了。很多人会认为他比较简单。但是和String有关的面试题有很多,下面我随便找两道面试题,看看你能不能...
摘要:对比较返回是因为这个字符串在执之前已经出现过,字符串常量池中已经有它的引用了,不符合首次出现的原则,而计算机软件这个字符串则是首次出现的,因此返回。 在《深入理解Java虚拟机》书中,提到在jdk1.7的版本中用String.intern()返回引用。 public class RuntimeConstantPoolOOM { public static void main(S...
摘要:证明返回常量池中已存在的对象,不等于新建的对象。为什么要设计成一下内容来自发现百度的中文版本基本也是此文的翻译版。总之,安全性和字符串常量池缓存是被设计成不可变的主要原因。 String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源标明最后,不确...
摘要:种基本类型的常量池都是系统协调的,类型的常量池比较特殊。在中,字符串常量池已经从区移到正常的区域。此时引用对象内容是,但此时常量池中是没有对象的。这样,首先执行声明的时候常量池中是不存在对象的,执行完毕后,对象是声明产生的新对象。 概览 1. 类声明 String 被声明为 final,因此它不可被继承。 在 Java 8 及之前,内部使用 char 数组存储数据。 public fi...
摘要:所以我决定先从类入手,深入的研究一番来开个好头。之所以会有以上的效果,是因为有字符串常量池的存在。同时运行时实例创建的全局字符串常量池中有一个表,总是为池中的每个字符串对象维护一个引用,所以这些对象不会被。 开始写 Java 一年来,一直都是遇到什么问题再去解决,还没有主动的深入的去学习过 Java 语言的特性和深入阅读 JDK 的源码。既然决定今后靠 Java吃饭,还是得花些心思在上...
阅读 1993·2019-08-30 15:52
阅读 2939·2019-08-29 16:09
阅读 1288·2019-08-28 18:30
阅读 2427·2019-08-26 12:24
阅读 1012·2019-08-26 12:12
阅读 2240·2019-08-26 10:45
阅读 541·2019-08-23 17:52
阅读 729·2019-08-23 16:03