Java中equals和==操作符解析

总结:

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
	}

}


你可能感兴趣的:(Java中equals和==操作符解析)