JDK1.7后的字符串比较

来源:互联网 发布:windows sever 2003 编辑:程序博客网 时间:2024/06/05 12:50
1 、String a = "123";
       String b = "123";
       a == b;                  //true
       a.equals(b);         //true

2、String a = new String("123");
      String b = new String("123");
      a == b;                 //false
      a.equals(b);        //true

3、String a = new String("123").intern();
      String b = new String("123").intern();
      a == b;                 //true
      a.equals(b);         //true



造成上面三种不同结果的分析:

 例1:a创建的字符串常量放在了方法区的常量池中,在定义b的时候会先到常量池中查找是否存在该字符串常量。因为存在,所以b直接使用该字符串常量,因此a和b的内容相同,引用也相同。


例2:通过String构造方法创建的字符串会直接在堆中产生对应的String类型对象,然后a直接引用该对象。当定义b的时候又会在堆中创建新的对象。因此,尽管a和b的内容相同,但是引用了不同的对象,使得a != b。


例3:在调用String的intern方法的时候,会去常量池中看是否有与该对象内容相同的字符串(即equals为true)。若没有,则将该字符串放到常量池并返回常量池的字符串;若有,则直接返回常量池的字符串。(注意:JDK1.7之前结果不同)


因此下面判断结果:

"123" == new String("123").intern();     //true

"123" == "123".intern();      //true


String a = new String("123");

a == a.intern();      //false


     


原创粉丝点击