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

来源:互联网 发布:淘宝店铺管控记录 编辑:程序博客网 时间:2024/05/22 10:58
  • 第一种情况
    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”对象。

0 0
原创粉丝点击