- public class TestPerson {
- public static void main(String[] args) {
-
- String s="abc";
- String b=new String("abc");
-
- System.out.println(s.equals(b));
- System.out.println(s==b);
-
-
-
- }
- }
复制代码
结果输出分别是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中对象的引用返回给用户。 |
|