Java-字符串创建与存储的机制

Java-字符串创建与存储的机制解析

Posted by Jinliang on April 8, 2017
  • 第一种情况

    String str1 = new String(“abc”); String str2 = new String(“abc”); 这两个声明,代表存在两个对象,内容相同,但是内存地址不同,即在堆中的位置不同。只要用new总会生成新对象。

  • 第二种情况

    String str1 = “abc”; String str2 = “abc”; 在JVM存在一个字符串池,里面保存很多String对象,并且可以被共享使用,str1,str2引用的是同一个String对象。

String内部的机制:

  • 关于常量池

String的实现采用了Flyweight(享元)的设计模式,当创建一个字符串常量时,首先在字符串常量池中查找是否已经有相同的字符串被定义,判断依据是equals(Object object)方法。若已经定义,获取对其的引用,不需要创建新的对象;如果不存在,首先创建这个对象,然后加入到字符串常量池中,再将它的引用返回;

  • 关于堆
public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

这是String类的构造方法。 当new String(“abc”)时,首先判断常量池中是否有“abc”,如果没有,则创建对象,加入到常量池中,然后将常量池的“abc”作为String构造方法的参数,创建新的“abc”String对象;如果有,那么直接创建“abc”String对象,参数时常量池中的“abc”对象。