黑马程序员技术交流社区

标题: java字符串池(string pool)和字符串堆(heap)内存分配 [打印本页]

作者: iamheima123    时间: 2015-10-29 13:49
标题: java字符串池(string pool)和字符串堆(heap)内存分配
  1. public class TestPerson {

  2.         public static void main(String[] args) {
  3.                
  4.                 String s="abc";
  5.                 String b=new String("abc");
  6.        
  7.                 System.out.println(s.equals(b));
  8. System.out.println(s==b);
  9.                
  10.                
  11.        
  12.         }

  13. }
复制代码

结果输出分别是true和false。那么这两种创建字符串的方式有何区别呢?那先了解一下String在Java中的运作方式吧!要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。java为什么要把String设计为非可变类呢?你可以问问 james Gosling :)。但是非可变类确实有着自身的优势,如状态单一,对象简单,便于维护。其次,该类对象对象本质上是线程安全的,不要求同步。此外用户可以共享非可变对象,甚至可以共享它们的内部信息。(详见 《Effective java》item 13)。String类在java中被大量运用,甚至在class文件中都有其身影,因此将其设计为简单轻便的非可变类是比较合适的。

虽然两个语句都是返回一个String对象的引用,但是第一种是jvm首先会在内部维护的String Pool中通过String的equels方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则创建新的String对象添加至String Pool中,将其引用返回给用户。  而 第二种是jvm会在内部维护的String Pool中放入一个"abc"对象,并在heap中创建一个String对象,然后将该heap中对象的引用返回给用户。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2