jdk7 之前和之后的版本,string 的 intern() 方法在实现上存在差异,本文的说明环境是 jdk8,会在文末说明 intern() 方法的版本差异性。
intern() 方法是一个 native 的方法,返回常量池中的字符串引用,主要体现在以下两点:
一般我们创建字符串的方式有以下三种:
字面量创建方式,会在字符串常量池中创建字符串实例,并返回该引用;new string() 和 stringbuilder/stringbuffer 创建方式都是在堆(heap)上创建字符串实例,并返回该引用。
public class strintrentest { public static void main(string[] args) { // 1. 字面量创建形式 string s1 = "jmcui"; // 1. 在字符串常量池中生成字符串【"jmcui"】实例 // 2. 将栈中的 s1 指向字符串常量池中的字符串【"jmcui"】实例 system.out.println("s1 == s1.intern() :" + (s1 == s1.intern())); // true // 2. new 创建方式 string s2 = new string("jmcui"); // 1. 在java堆中生成字符串【"jmcui"】实例 // 2. 将栈中的 s2 指向java堆中的字符串【"jmcui"】实例 system.out.println("s1 == s2 :" + (s1 == s2)); // false system.out.println("s1.equals(s2) :" + s1.equals(s2)); // true system.out.println("s1 == s2.intern():" + (s1 == s2.intern())); // true // 3. stringbuilder/stringbuffer 方式和 new 方法类似 string s3 = new stringbuilder("jm").append("cui").tostring(); // 1. 在java堆中生成字符串【"jmcui"】实例 // 2. 将栈中的 s3 指向java堆中的字符串【"jmcui"】实例 system.out.println("s1 == s3 :" + (s1 == s3)); // false system.out.println("s2 == s3 :" + (s2 == s3)); // false system.out.println("s2.intern() == s3.intern() :" + (s2.intern() == s3.intern())); // true } }
jdk7 之后的 intern() 方法和之前版本的差异主要体现在:如果常量池中不存在该字符串时的处理机制。
jdk7 之后的版本,如果常量池中不存在该字符串,则在常量池中加入该对象引用并返回。注意,关键词 — 加入对象引用!
jdk7 之前的版本呢?它的处理机制是,如果常量池中不存在该字符串,则在常量池中新建一个字符串实例并返回该实例引用。关键词:新建实例!
如对本文有疑问, 点击进行留言回复!!
vue学习----1.初识vue&&vue基本语法
sap cloud platform destination的配置
springcloud中feign调用处理mybatis-plus Ipage反序列化问题。
网友评论