总结:
1)==操作符:
对于原生数据类型,就比较他们的值。如果两个原生数据类型不一样,如int和double,会自动做溢出或截断处理。
对于包装类,同类型的两个对象进行==操作,会自动解包为两个相应的基本数据类型。不同类型的包装类,不能进行==操作。
对于引用类型,同类型的两个对象进行==操作相当于比较他们的地址,返回false;不同类型不能进行==操作。
注意:Interger初始化超过-128<=i<=127范围的数时是new一个对象,此时用==操作符返回false.
2)equals:
比较两个操作数的字面值,适用于引用类型。通常比较的是两个操作对象的equals()方法,可以自己override类的equals()方法,同时hashCode()方法也应该与之成对出现。
测试代码如下:
public class Foo { @Override public boolean equals(Object obj) { return true; } // @Override // public int hashCode() { // return 100; // } }
public class Goo { @Override public boolean equals(Object obj) { return true; } // @Override // public int hashCode() { // return 100; // } }
public class Hoo { int no; String name; public Hoo(int no, String name) { this.no = no; this.name = name; } @Override public boolean equals(Object obj) { if (obj instanceof Hoo) { Hoo h = (Hoo) obj; if (h.getNo() == getNo() && h.getName() == getName()) { return true; } } return false; } @Override public int hashCode() { //实现自己的hashCode,在HashSet中可以避免添加“重复”对象 return getNo(); } public int getNo() { return no; } public String getName() { return name; }
public class Test { public static void main(String[] args) { //原生数据类型 int a = 10; long b = 10; double c = 10; System.out.println("a==b:" + (a == b));//true.基本数据类型不能使用equals System.out.println("a==c:" + (a == c));//true System.out.println("c==a:" + (c == a));//true //包装类 Integer i=100; Integer j=100; Double d = 100d; System.out.println("i==j: " + (i == j)); // true System.out.println("i.compareTo(j): " + i.compareTo(j));//0 // System.out.println(i==d); // 编译失败:Incompatible operand types Integer and Double System.out.println("i.equals(d): " + i.equals(d)); //不同的引用类型之间比较 Foo f = new Foo(); Goo g = new Goo(); Goo g1 = new Goo(); System.out.println("f = " + f + "----g = " + g); // System.out.println("f == g : " + (f == g));//编译失败:incompatible operand types Foo and Goo System.out.println("g == g1 : " + (g == g1));//false System.out.println("g.equals(g1) : " + g.equals(g1));//true System.out.println("f.equauls(g) : " + f.equals(g));//true //同类型不同对象之间的比较 Hoo h1 = new Hoo(20, "hoo"); Hoo h2 = new Hoo(20, "hoo"); System.out.println("h1 == h2 : " + (h1 == h2));//false System.out.println("h1.equals.(h2) : " + h1.equals(h2));//true } }