==与equals到底有啥不一样

1. ==

a.如果比较的是基本数据类型,则直接比较其存储的值是否相等。

int i = 10;
int j = 10;
System.out.println(i ==j);

b.如果比较的是引用类型的变量,则比较的是所指向的对象的地址。

String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);
2. equals

如果没有对equals方法进行重写,它和==的作用是一样的。

/**
** Object.java中equals的实现
**/
public boolean equals(Object obj) {
        return (this == obj);
}

重写equals方法后可以实现两个对象"值"相等。重写equals方法时需要重写hashCode方法。

为什么重写equals需要重写hashCode?
java中对象的比较有如下规定:

  1. 应用执行期间,同一个对象内容不发生改变,无论经过多少次调用hashCode方法返回值必须是同一个值。
  2. 如果两个对象equals方法比较是相等的,那么所两个对象的的hashcode也必须一样。
  3. 如果两个对象equals方法比较是不相等的,那么两个对象的hashcode可能一样,也可能不一样。

为了保证equals相等时对象hashcode必须相等,一般重写equals方法时需要重写hashCode方法。

案例

下面以学生为例来演示重写equals和hashCode方法。

class Student {
	private String name;
	private int age;

	public Student(String name, int age) {
		this.age = age;
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public String getName() {
		return name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void setName(String name) {
		this.name = name;
	}

	/**
	 * 姓名和年龄都相等才相等
	 * @param obj
	 * @return
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
}

public class EqualsDemo {
	
	public static void main(String[] args) {
		Student stu1 = new Student("name1", 20);
		Student stu2 = new Student("name1", 20);
		//两个对象 false
		System.out.println("stu1 == stu2 : " + (stu1 == stu2));
		//值相等 true
		System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2));
	}
}

运行结果:

stu1 == stu2 : false
stu1.equals(stu2) : true

猜你喜欢

转载自blog.csdn.net/cl2010abc/article/details/105528774