关于 String.intern()

String.intern() 实际上会返回第一次生成该 String 内容的那个实例.

所谓内容就是 "abc", "123" 这个字符串的内容

1.

String s1 = "a"; ([email protected])

那么 s1 就是第一次生成内容 "a" 的实例 @100, 所以如果

String s1 = "a"; ([email protected])

String s2 = "a"; ([email protected])

由于他们的内容相同, 又没有显式的 new, 所以会使用同一个实例, 自然底层的 char[] 也是同一实例的

2.

String s1 = "a"; ([email protected]) (char[]@200)

String s2 = new String("a"); ([email protected]) (char[]@210)

但是要注意一点, 这种情况虽然两个 String 实例不同, 他们底层的 char[] 却是同一实例

3.

String s1 = "ab"; ([email protected]) (char[]@200)

String s2 = "a";

String s3 = s2 + "b"; ([email protected]) (char[]@210)

用变量拼接字符串, 最终 String 实例不同, char[] 实例也不同

4.

String s1 = "ab"; ([email protected]) (char[]@200)

String s2 = "a";

String s3 = s2 + "b"; ([email protected]) (char[]@210)

String i1 = s1.intern(); ([email protected])

String i3 = s3.intern(); ([email protected])

最后会发现 i1 == i3, 他们是同一个实例, 这就是 intern 的作用, 它会返回第一个实例化这个字符串内容的实例, 在这里就是 s1, 即使 s3 != s1, s3.intern() 也会返回 s1, 因为 s1 是第一个

5.

String s1 = new String("ab"); ([email protected])

String s2 = s1.intern(); ([email protected])

s1 != s2 要注意, 是因为 s1 使用了 new String(), 实际上在 "ab" 出现的时候, 就已经生成了一个 String 实例, 所以 String s1 = new String("ab"); 这一行程序, 会生成 2 个 String 实例, 虽然他们内部的 char[] 是一样的. 最终, s1.intern() 会返回第一个你看不到的实例

时间: 2024-08-04 13:21:40

关于 String.intern()的相关文章

深入解析String.intern()方法

转载: http://tech.meituan.com/in_depth_understanding_string_intern.html 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如

对String.intern()的理解

一直对String对象里面的intern()方法不是很了解,最近在读<深入理解Java虚拟机>这本书里面终于得到了一个比较清晰的解释.这个方法是可以获得一个具体的String在字符串常量池中的一个引用,书里面有一段实例代码, String str1= new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern()==str1); String str2=

JDK源码学习(2)-String.intern()方法详解

1.方法intern()为java内部方法,如下  public native String intern(); native方法为通过jvm进行运行,jdk8中隐藏了该方法的具体处理方法. 2.作用:该方法注释为 "如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回". 3.测试代码一 public static void main(String[] args) { String s1 = new String(&

String学习之-深入解析String#intern

引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.它的主要使用方法有两种: 直接使用双引号声明出来的String对象会直接存储在常量池中. 如果不是用双引号声明的String对象,可以使用String提供的intern方法.intern 方法会从字符串常量池中查询当前字符串是否存在

Java中的String常量和String.intern的实现

在java中有constantPool常量池,常量池里对类,方法,接口的常量,而对于存放字符串常量通常存放的符号链接Symbol 或者真实的String的对象的引用. 我们来看一段简单的代码和反编译字节码 public class test { public static void main(String[] args) { String test = "test"; } } Constant pool: #1 = Class #2 // test #2 = Utf8 test #3

深入解析String#intern

转自:https://tech.meituan.com/in_depth_understanding_string_intern.html 深入解析String#intern john_yang ·2014-03-06 17:10 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊.

String放入运行时常量池的时机与String.intern()方法解惑

运行时常量池概述 Java运行时常量池中主要存放两大类常量:字面量和符号引用.字面量比较接近于Java语言层面的常量概念,如文本字符串.声明为final的常量值等. 而符号引用则属于编译原理方面的概念,包括了下面三类常量: - 类和接口的全限定名(包名+类名) - 字段的名称和描述符 - 方法的名称和描述符 运行时常量池位置 运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在HotSpot虚拟机中方法区放在了"永久代(Permanent Generation)".所以

String intern()方法详解

执行以下代码 String a1=new String("abc");       String a2=new String("abc");       System.out.println(a1==a2);       System.out.println(a1==a2.intern());       System.out.println("abc"==a2.intern());       System.out.println(a1.int

Java提高篇——理解String 及 String.intern() 在实际中的应用

1. 首先String不属于8种基本数据类型,String是一个对象.   因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String("")都是申明一个新的空字符串,是空串不是null: 3. String str="kvill":  String str=new String ("kvill");的区别: 在这里,我们不谈堆,也不谈