ITKeyword,专注技术干货聚合推荐

注册 | 登录

Java:equals和hashCode的理解

leelit 分享于 2014-12-06

推荐:对java中equals和hashCode函数的一些理解

JDK的java.lang.Object类中实现了equals函数,其定义说明如下: 引用     public boolean equals(Object obj)          Indicates whether some other object is

2020腾讯云7月秒杀活动,优惠非常大!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1040

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

    我们一般使用equals都是为了比较对象的内容,而Object里面的equals方法却是比较对象的引用,如下:

public boolean equals(Object obj) {
        return (this == obj);
    }
所以当我们想要比较的是对象的内容时,需要重写equals方法,假设User类中有String name , int age 两个字段,用eclipse自动生成的 equals方法写法如下:

public boolean equals(Object obj) {
	if (this == obj)
		return true; // 两者引用相等则是同一个对象故内容相等
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())  // 两者的类不相等,则内容不可能相等
		return false;
	User other = (User) 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;
}
一个测试用例

public class Test {
	public static void main(String[] args) {
		User user1 = new User();
		User user2 = new User();
		System.out.println(user1.equals(user2));
 	}
}
打印true。如果把User类重写的equals方法去掉,此时user1.equals()调用的是Object类的equals方法,比较的是引用而不是内容,user1和user2的引用明显不同,故打印false。常用的equals方法比较的是对象的内容,即对象要属于同一个类且字段属性相等才相等。

    HashCode主要用于类集框架。假设我们对一个类不重写hashCode方法,对象调用hashCode方法时则调用的是Object类的hashCode方法:

public native int hashCode();
生成的散列值都是不相同的,而如果我们重写了hashCode方法,对于内容相同的对象则可以生成相同的散列值。

至于hashCode方法写法,我们一般也不需要记住,直接用工具生成就好了。

测试用例:

推荐:java中的==、equals()、hashCode()

1、java 判断字符串是否为空 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低:                       if(s == null ||"".equals(s)); 方法二: 比较字符

public class Test {
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		HashSet<User> set = new HashSet<>();
		User user1 = new User("leelit", 21);
		User user2 = new User("leelit", 21);
		User user3 = new User();
		
		System.out.println(user1.hashCode());
		System.out.println(user2.hashCode());
		System.out.println(user3.hashCode());
		
		set.add(user1); // 添加user1和user2
		set.add(user2);
		System.out.println(set.size());

		HashMap<User, String> map = new HashMap<>();
		map.put(new User("lina", 21), "value");
		System.out.println(map.get(new User("lina", 21)));
	}
}

打印结果:

-1106625705
-1106625705
961
1
value

把User类重写的hashCode方法去掉后打印:

31168322
17225372
5433634
2
null

没有重写hashCode方法时:两个对象即使内容相等,也生成不同的散列值,所以都可以add进set里面去,我们知道HashSet是不可以有重复的元素的,所以这就是为什么必须要重写hashCode的原因;同理对于HashMap虽然put和get的是同样的key,但由于散列值不同,而被视作了不同的key,所以无法取出来。

重写hashCode方法后,两个相等的对象会生成相同的散列值。



推荐:Java:重写equals()和hashCode()

1. 何时需要重写 equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。 2. 设计 equals() [1] 使用 instanceof 操作符检查“实参是否为正

    我们一般使用equals都是为了比较对象的内容,而Object里面的equals方法却是比较对象的引用,如下: public boolean equals(Object obj) { return (this == obj); }所以当我们想

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。