String类型的相等分为N多种。。(原来一直用“==”判断两个字符串相等,某天Debug时发现两个“值”相同的String死活不“==”,才发现String相等不止一种)
例子:
public class EqalTest {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
System.out.println(c.equals(d));
}
}
返回
true
false
false
true
true
true
首先要说一说String这个类型,String不是基本数据类型,new String() ,new String(“”)都创建了一个空字符串,不是null。
常量池(字符串池)的概念
自己理解为内存中专门用来存放字符串常量的一块地方,并且每个字符串常量的值跟其他的都不一样(具有唯一性,任何两个都不同)。定义String a = "abc"; String b = "abc";后,在编译时“abc”放入常量池,a,b对象均指向"abc"
关于new String()
String c = new String("abc"); new产生的对象c不指向常量池里的“abc”,他是在堆内存中重新存入一个“abc‘(堆内存用于存放由new创建的对象和数组,每次new都创建,不论字串是否相等)。
先来说“==”
”==“比较的是指向两边字符串的引用是否相同,即两边字符串存放地址是否相同,a,b都指向常量池同一”abc“,地址相同,所以a==b为true。c指向其在堆内存创建的"abc",与a指向的"abc"存放地址不同,所以a==c为false。d也是在堆中新创建一个"abc",与c地址不同,所以c==d为false。
再说说equals()
equals()就是比较字符串的内容,a、b、c、d均为abc,均返回true。
参考:
http://blog.csdn.net/chthq/article/details/7909720
http://zhidao.baidu.com/question/238440438.html
http://blog.csdn.net/liucheng2009/article/details/6656940