String与字符串池

来源:互联网 发布:c语言从偶数2加到100 编辑:程序博客网 时间:2024/06/18 03:59
public class StringInternTest {    public static void main(String[] args) {    // 使用char 数组来初始化a,避免在a 被创建之前字符串池中已经存在了值  为"abcd"的对象    String a = new String(new char[] { 'a', 'b', 'c', 'd' });    String b = a.intern();    if (b == a) {    System.out.println("b 被加入了字符串池中,没有新建对象");    } else {    System.out.println("b 没被加入字符串池中,新建了对象");    }    }  }  
b 没被加入字符串池中,新建了对象


字符串池和String类的基本关系:
  Java运行环境有一个字符串池,由String类维护。
  1、执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。
  2、执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给str。
  3、当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
   
  String a = new String(new char[] { 'a', 'b', 'c', 'd' }); 这个就是第二种情况了,此时字符串a不在字符串池中,String b = a.intern(); 因为a不在字符串池中,所以在执行a.intern()时,会把a添加在池中,然后返回a的引用,所以b的值就是a的引用,所以a不等于b。

它遵循以下规则:对于任意两个字符串 st,当且仅当 s.equals(t)true 时,s.intern() == t.intern() 才为 true


String a = new String(new char[] { 'a', 'b', 'c', 'd' });  
        System.out.println(a=="abcd");

---false

String a = new String(new char[] { 'a', 'b', 'c', 'd' });  
        String b = a.intern();
        System.out.println(b=="abcd");

---true