InstanceOf在equals方法中使用存在的一个隐患

详细的讲解参考学长的两篇文章就ok了,写的相当详细,包括什么自反性对称性的。

Java 基础-hashCode方法

Java 基础-equals方法    


另外补充一点,我所使用的是Eclipse编译器,一般重写这两个方法我一般都是先自动生成代码,然后再根据实际情况添加对象的判断条件即可。例如这里有一个Person类:

public class Person {
	private String name;
	private int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	
}

其中构造函数也是通过Alt+S+A自动生成的,关于Eclipse的一些小技巧可是参照我的另一篇文章:关于Eclipse的一些使用技巧

然后Alt+S+H就可以自动生成hashCode和equals方法:

public class Person {
	private String name;
	private int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@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;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) 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;
	}
	
	
}
可以看到,自动生成的equals中需要名字和年龄都相同才返回true。如果我们仅仅是需要名字相同就判断相同的话就把
if (age != other.age)
			return false;

这段代码删掉就行了。


以上内容仅为个人观点,如有错误或者不当之处还望指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重写 hashCode() 和 equals() 方法是为了能够正确地比较两个对象是否相等。hashCode() 方法用于计算对象的哈希码,equals() 方法用于比较两个对象是否相等。 在一个重写 hashCode() 和 equals() 方法需要注意以下几点: 1. hashCode() 方法必须与 equals() 方法一致。如果两个对象相等,它们的 hashCode() 方法返回的值必须相等。 2. equals() 方法必须满足自反性、对称性、传递性和一致性。即: - 自反性:任何对象都必须与自身相等。 - 对称性:如果对象 A 与对象 B 相等,那么对象 B 也必须与对象 A 相等。 - 传递性:如果对象 A 与对象 B 相等,对象 B 与对象 C 相等,那么对象 A 也必须与对象 C 相等。 - 一致性:如果对象 A 与对象 B 相等,在对象 A 和对象 B 没有改变的情况下,多次调用 equals() 方法应该返回同样的值。 3. hashCode() 方法的实现应该尽可能均匀地分布对象的哈希码,以减少哈希冲突的概率。 4. hashCode() 方法equals() 方法使用的字段应该是相同的。如果 equals() 方法比较的字段不包括 hashCode() 方法计算的字段,那么两个相等的对象可能会有不同的哈希码。 下面是一个示例代码,演示如何在一个重写 hashCode() 和 equals() 方法: ```java public class Person { private String name; private int age; // 构造方法和 getter/setter 方法省略 @Override public int hashCode() { int result = 17; result = 31 * result + name.hashCode(); result = 31 * result + age; return result; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof Person)) { return false; } Person other = (Person) obj; return Objects.equals(name, other.name) && age == other.age; } } ``` 在这个示例,我们使用了 Objects.equals() 方法来比较 name 字段是否相等,它会自动处理 null 值的情况。在 hashCode() 方法,我们使用了经典的乘法-加法哈希算法,通过将每个字段的哈希码与一个质数相乘,再相加得到最终的哈希码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值