`
lg_asus
  • 浏览: 191836 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java String.intern()

阅读更多
在看《深入理解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 指令,以后再研究。
分享到:
评论

相关推荐

    JVM系列之String.intern的性能解析

    在Java虚拟机(JVM)中,`String.intern()` 是一个非常特殊且重要的方法,它与字符串常量池紧密相关。字符串常量池是一种内存优化机制,存储了程序中所有的字符串字面值和通过 `intern()` 方法添加的字符串。这个池...

    深入理解 Java String#intern() 内存模型.docx

    "深入理解 Java String#intern() 内存模型" Java String#intern() 内存模型是 Java 语言中一个重要的概念,.string#intern() 方法是 Java 字符串常量池中一个重要的组件。字符串常量池是一个固定大小的 HashMap,桶...

    java 中String.equals和==的比较

    Java 中 String.equals 和 == 的比较 Java 中 String.equals...需要注意的是,在 Java 中,String 是一个特殊的类,它可以使用字面量来创建字符串对象,并且可以使用 intern() 方法将字符串对象添加到字符串常量池中。

    提高 Java 代码性能的各种技巧.docx

    这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。 Java 6 中的 String.intern() 在 Java 6 中,String.intern() 方法将所有共享的 String 对象...

    深入理解JavaString#intern()内存模型Ja

    在Java编程语言中,`String`类是极其重要的,它提供了许多用于操作字符串的方法,其中之一便是`intern()`。深入理解`String#intern()`方法对于优化内存使用和理解Java的内存模型至关重要。`intern()`方法是一个非常...

    关于java String中intern的深入讲解

    Java String 中 intern 的深入讲解 Java String 中的 intern 方法是一个非常重要的概念,它可以将字符串对象存储在字符串常量池中,以便重复使用相同的字符串对象,减少内存的占用。下面我们将深入讲解 Java String...

    通过String.intern()方法浅谈堆中常量池

    String类的intern()方法在Java中扮演着重要的角色,它涉及到字符串对象的内存管理和性能优化。这个方法的主要功能是检查当前字符串对象的值是否已经在Java虚拟机(JVM)的字符串常量池中存在。如果存在,它会返回...

    Java String的intern用法解析

    Java String的intern用法解析 Java String的intern方法是Java中一个非常重要的方法,它可以将字符串常量池中的字符串对象返回给我们。今天,我们将深入探究Java String的intern用法解析,了解它的工作原理和应用...

    字符串string.zip

    字符串字面量和`String.intern()`方法都涉及到字符串池的概念。 本压缩包的“Chapter15”可能涵盖了以上部分或全部知识点,包括实例演示、上机练习参考答案和课后作业参考答案,为学习者提供了实践和巩固所学的宝贵...

    全面理解java中的String.doc

    总之,理解Java中的String类,特别是它的创建方式、常量池以及`intern()`方法的工作原理,对于编写高效、内存友好的代码至关重要。在实际编程中,根据需求合理选择创建和操作字符串的方法,可以避免不必要的内存开销...

    解析Java中的String对象的数据类型 字符串

    String.intern()方法是Java中的一个方法,它可以将一个String对象添加到常量池中。如果在常量池中已经存在相同的Unicode字符串常量,那么String.intern()方法将返回该常量池中的字符串常量的引用,否则,它将在常量...

    String类的intern、split方法

    String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义如下:public native String intern();该方法返回一个字符串对象的内部化引用,由 String 类维护一个初始为空的字符串的对象池,当 ...

    Java String对象的经典问题

    ### Java String对象的经典问题 #### 一、String 类与对象机制概述 在Java中,`String`类是一个非常重要的类,它提供了丰富的功能用于处理文本数据。`String`类是不可变的(immutable),这意味着一旦一个`String`...

    Java类库复习——java.lang.String

    在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...

    java高并发写入用户信息到数据库的几种方法

    使用 String.intern() 方法可以实现对同一用户的加锁,锁粒度较小,能够更好地提高并发性能。 ```java public synchronized void write(Uers u){ synchronized(u.getUserId().intern()) { // do something } } `...

    深入理解Java String#intern()内存模型

    大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,会在字符串常量池中创建该字符串然后再返回。  字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, ...

    浅谈Java String内幕(下)

     String.intern()是一个Native方法,底层调用C++的 StringTable::intern 方法,源码注释:当调用 intern 方法时,如果常量池中已经该字符串,则返回池中的字符串;否则将此字符串添加到常量池中,并返回字符串的...

    Java字符池.pdf

    有时人们误以为`String.intern()`会将所有String对象都放入全局String表,实际上只有当字符串的Unicode序列在常量池中不存在时,`intern()`才会这么做。对于已经存在的字符串,`intern()`只会返回常量池中的引用。 ...

Global site tag (gtag.js) - Google Analytics