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

String intern() 在JDK1.6/1.7差异

    博客分类:
  • java
阅读更多

public static void main(String[] args) {

String s1 = new StringBuilder("计算机").append("啊").toString();

System.out.println(s1.intern() == s1);

String s2 = new StringBuilder("ja").append("va").toString();

System.out.println(s2.intern() == s2);

}

 

这段代码在JDK1.6上运行,会得到2个false,而在1.7上,会得到一个true 一个false。

原因来自于

 

1.6下:intern()方法会把首次遇到的字符串实例复制到永久代中,返回永久代中这个字符串实例的引用。而由StringBuilder创建的实例在Java堆中,必然不是同一个引用。返回false.

1.7下:intern()不会复制实例,只是在常量池中记录首次出现的实力引用。所以intern()返回的引用和StringBuilder创建的字符串实例是同一个。 s2为什么会返回false呢?因为“java”这个字符串在执行StringBuilder.toString()前就出现过,已经有他的引用了。所以不是同一个对象。

分享到:
评论

相关推荐

    jdk6-8String类

    这里我们将对JDK 1.6、1.7和1.8中的`String`类进行对比研究,探讨其中的关键变化。 ### JDK 1.6中的String 在JDK 1.6中,`String`类主要关注于基础功能和效率。它的内部实现使用字符数组`char[]`存储字符串数据,...

    jdk1.7+jdk1.8

    标题中的"jdk1.7+jdk1.8"指的是两个不同版本的JDK,分别是Java 7和Java 8。这两个版本在Java发展历程中占据了重要的位置,各有其特色和改进。 **Java 7(JDK 1.7):** Java 7于2011年发布,它的主要更新包括: 1....

    jdk1.8之后的String.intern()方法内存分析

    关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...

    java String的intern方法

    在JDK 1.6中,`String`的`intern()`方法的行为如下: 1. 当调用`intern()`时,JVM会检查字符串常量池中是否存在与当前`String`对象内容相同的字符串。 2. 如果找到匹配的字符串,`intern()`方法将返回常量池中该字符...

    java-JVM-面试题

    - `String::intern()`:这个方法将字符串常量池中的字符串引用返回,如果不存在则添加到池中。在不同JVM实现中,行为可能有所不同。 5. **HotSpot虚拟机** - HotSpot是Oracle的JVM实现,从JDK 6开始广泛使用,...

    jdk-7u80-windows-x64.rar

    在本文中,我们将深入探讨Java JDK 1.7的关键特性、安装过程以及其在软件开发中的作用。 首先,Java JDK 1.7包含了Java编译器(javac)、Java解释器(java)、Java虚拟机(JVM)、Java类库以及开发者工具,如...

    rt.jar源码

    《深入解析JDK1.7 rt.jar源码》 在Java开发中,rt.jar是一个至关重要的文件,它包含了Java标准类库(Java Standard Library)的所有核心类。rt.jar的源码,就像是Java世界的基础蓝图,揭示了Java API背后的实现细节...

    求职宝典-Java 基础面试题

    在JDK 1.7及以后,String类的intern()方法会将字符串添加到运行时常量池,使得在比较时能正确处理常量池与堆中的对象。 3. **equals与hashCode的关系**: - 当重写equals方法时,通常也需要重写hashCode方法。因为...

    Java内存溢出及分析

    在JDK 1.7及以上版本,字符串常量池移到了堆中,使用`String.intern()`方法不会导致方法区溢出。 4. **堆**:这是Java中最大的一块内存区域,用于存储所有对象实例和数组。当创建大量大对象或存在大量互相引用的...

Global site tag (gtag.js) - Google Analytics