以下是我的理解,可能有误 Java中的“==”用来判断是否是同一个对象(对象的引用是不是一样),equals方法一般会被覆盖,主要是比较值,而且一般只和同一类对象比较。
String的比较
public class TestEqual {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");//新建了一个对象
String d = new String("abc");
String e = "ab"+"c";//使用常量池中的对象
String f = "ab";
String g = f + "c";//string是固定字符,需要新建对象
System.out.println(a == b);//true,第一次a把字符串放在常量池,那b继续用这个常量,e也一样
System.out.println(a.equals(b));//true
System.out.println("a == c?"+(a == c));//false
System.out.println(a.equals(c));//true
System.out.println(c==d);//false
System.out.println(a==e);//true
System.out.println(a==g);//false
}
}
还有个String.intern()不太理解
更多的信息可以看这里:http://developer.51cto.com/art/200602/21445.htm
数字的比较
需要理解autoBoxing的概念!
public class TestEqual {
public static void main(String[] args) {
Integer i1 = new Integer(9);
Integer i2 = new Integer(9);
int i3 = 9;
int i4 = 9;
Integer i5 = 9;//自动装箱(box)操作,基本类型int 9可以自动box成对象Integer
Integer i6 = 9;
Long long1 = new Long(9);
System.out.println(i1==i2);//false
System.out.println(i1==i3);//true
System.out.println("i3==i4?"+(i3==i4));//true,常量池
System.out.println("i1==i3?"+(i1==i3));//true
System.out.println("i5==i6?"+(i5==i6));//true,当-128<i5<127时为true,其他为false
//http://blog.csdn.net/newsonglin/archive/2008/10/15/3079865.aspx
// If the value p being boxed is true, false, a byte, a char in the range \u0000 to \u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.
System.out.println("i3==i5?"+(i3==i5));//false
System.out.println("i1==i5?"+(i1==i5));//false
System.out.println(i1.equals(i2));//true,同类型比较值
System.out.println(i1.equals(long1));//false,不同类型不进行比较
}
}
更多的信息可以参考这篇文章:http://blog.csdn.net/newsonglin/archive/2008/10/15/3079865.aspx