`
hilary3113
  • 浏览: 265625 次
  • 性别: Icon_minigender_1
  • 来自: 邯郸
社区版块
存档分类
最新评论

JAVA 字符串驻留池

    博客分类:
  • java
阅读更多

 

一切从String str = new String("abc")说起...

    这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。

    我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象。下面说明为什么创建了两个String对象。

    首先,来了解一下Java中的字符串驻留池的概念。JVM为了提高性能,将一下两种形式的字符串放在一个称之为字符串驻留池的内存块中:

    形式一:String str = "abc";

    形式二:"abc"

    其实,形式一和形式二都是字符串的字面常量。所以,可以这样理解,即把字符串的字面常量都放在了字符串驻留池中。对形式一来说,str其实就是引用的字符串驻留池中"abc"这个String对象。

    如果有如下的两行代码:

    String str1 = "abc";

    String str2 = "abc";

    那么,上面的两行代码创建了几个String对象?答案是一个。根据我们刚才所述,那么第一行语句将在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String对象,如果有,就直接引用,没有这在池中新建String对象。这下,就明白了为什么上面的两行语句仅仅创建了一个String对象。

    然后,让我们来看一看String str = new String("abc")。我们先不讨论到底创建了几个String对象。我们在这里,比较一下这种new的方式和上面的直接赋值方式两种创建String对象的不同,直接赋值的方式是在字符串驻留池中创建对象,但new这种方式是在堆中创建对象。即,new创建的String对象是不会放入字符串驻留池中的。如果一定要把某个通过new创建的字符串对象放入驻留池,可以使用intern()方法。如String strt = str.intern(),将把str的值放在驻留池中(当然,是在驻留池原来没有这个值对应的String对象的情况下),并返回驻留池中String对象的引用。

    现在,可以分析String str = new String("abc");创建了几个String对象了:)很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象

 

 

转自:http://hi.baidu.com/gujianting2010/blog/item/61167d17ef3e88cdf6039e53.html

分享到:
评论

相关推荐

    Java中的字符串驻留

    Java中的字符串驻留机制是为了优化字符串的使用,减少内存中不必要的重复对象。它涉及到Java的字符串常量池,这是一个特殊区域,存储了程序中所有的字符串字面量(literal strings)和通过`intern()`方法添加的字符...

    Java中字符串去重的特性介绍

    此外,这个特性只对驻留在老年代(Old Generation)的字符串有效,因为年轻代(Young Generation)的字符串可能会在下一次垃圾回收时就被清理掉。 总之,Java的字符串去重特性是一种优化手段,适用于处理大量字符串...

    Java8新特性之字符串去重介绍

    字符串驻留是在字符串常量池中实现的,当创建新的字符串常量时,如果常量池中已有相同内容的字符串,会直接返回该字符串的引用,从而避免创建新的对象。而字符串去重则是在运行时动态进行的,针对的是堆中的字符串...

    Python中的 is 和 == 以及字符串驻留机制详解

    这点和Java有点类似,只不过Java中是用 == 来比较两个对象在内存中的地址,用 equals() 来检查两者之间的值是否相等。 is == 概念 对象标示符 相等 作用 比较对象在内存中的地址 检查

    Java字符串的10大热点问题盘点

    下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧:  1、如何比较字符串,应该用”==”还是equals()?  总的来说,”==”是用来比较字符串的引用地址,而...

    十大常见Java String问题_动力节点Java学院整理

    如果涉及到字符串驻留(String Interning),则"=="也可能返回内容相等的字符串是否为同一个对象的结果。 2. **敏感信息处理:为何使用char[]优于String?** String对象是不可变的,意味着一旦创建就不能修改。这...

    JAVA性能--高效率执行JAVA[参考].pdf

    10. **尽量使用基本数据类型代替对象字符串**:直接引用字符串常量池中的字符串比创建新的String对象更高效。 11. **单线程使用HashMap和ArrayList**:在单线程环境中,HashMap和ArrayList比同步的Hashtable和...

    提高Java程序性能

    10. **使用基本数据类型代替对象**:直接引用字符串常量池中的字符串可以节省内存,而通过new创建的String对象会有额外的char数组开销。 11. **单线程环境下使用HashMap和ArrayList**:非同步的HashMap和ArrayList...

    java6string源码-opengrok:ssh的克隆://anon@hg.opensolaris.org/hg/opengrok/tru

    `String` 对象可以驻留在字符串常量池中,这是一个特殊的内存区域,用于存储共享的字符串。在编译期间,字面量字符串(如 `"hello"`)会被放入常量池。在运行时,如果通过 `new String()` 创建字符串,那么它将不会...

    java笔试与面试题(比较全)

    Java笔试和面试题涵盖了许多核心Java知识,包括面向对象特性、数据类型、异常处理、字符串操作、Servlet生命周期、集合框架以及企业级Java Bean(EJB)。以下是对这些知识点的详细解释: 1. **面向对象的特征**:面向...

    JAVA基础面试题(面向对象基础)

    综上所述,这些Java面试题涵盖了面向对象编程的核心概念,字符串处理,异常处理,以及Java集合框架和企业级应用开发的基础知识,这些都是Java开发者需要掌握的关键点。理解并熟练运用这些知识点对于成为一名优秀的...

    java面试大总结

    Java面试中的核心知识点涵盖了许多方面,这里我们将深入探讨...总之,Java面试中涉及的知识点广泛,包括面向对象编程原理、异常处理机制、字符串操作、以及Web开发的基础。掌握这些基础,将有助于你在面试中表现出色。

    huawei面试题--java篇

    3. **性能**:在单线程环境中,频繁修改字符串时,`StringBuilder`(`StringBuffer`的非线程安全版本)相比`StringBuffer`更高效,因为后者每次调用方法都要进行加锁和解锁。 #### 五、运行时异常与一般异常的异同 ...

    java面试,java葵花宝典

    `String`类代表不可变的字符序列,适用于创建常量字符串,而`StringBuffer`(以及其线程安全版本`StringBuilder`)则提供了可变的字符序列,适合于字符串的频繁修改场景。在性能上,对于需要修改的字符串,`...

    heap_java_heap_

    4. 使用String池:String对象是常量,使用String.intern()方法可以让字符串对象驻留在常量池中,节省堆空间。 5. 数据结构优化:选择合适的数据结构,如使用HashMap替代ArrayList存储大量元素,以减少内存开销。 6...

    java rmi HelloWorld版(源码)

    1. **创建远程接口**:定义一个简单的接口,比如`HelloWorldRemote`,包含一个返回字符串的`sayHello()`方法。 2. **实现远程对象**:创建一个类`HelloWorldImpl`实现`HelloWorldRemote`接口,并实现`sayHello()`...

    java面试葵花宝典

    StringBuffer是可变的,适合在字符串内容需要频繁修改的场景下使用,因为修改String需要创建新对象,而StringBuffer则可以直接在原有对象上操作。 5. **运行时异常与一般异常**:运行时异常是程序运行过程中可能...

Global site tag (gtag.js) - Google Analytics