gpt4 book ai didi

java - 哈希码在java中的实现

转载 作者:行者123 更新时间:2023-12-02 13:24:57 26 4
gpt4 key购买 nike

package MavenWeb.MavenWeb;

import java.util.HashMap;
import java.util.Map;

public class StringEquality {

public static void main(String[] args) {

Person p1 = new Person("Naveen", 22, 1000);
Person p2 = new Person("Naveen", 21, 2000);
Person p3 = new Person("Naveen", 23, 3000);

if(p1.equals(p2)){
System.out.println("P1 and p2 :" + p1.equals(p2));
} else{
System.out.println("P1 and p2 :" + p1.equals(p2));
}

if(p1.equals(p3)){
System.out.println("P1 and p3 :" + p1.equals(p3));
}


Map<Person, Object> map = new HashMap<Person, Object>();
map.put(p1, p1);
map.put(p2, p2);


System.out.println(map.get(new Person("Naveen", 21, 2000)));


}

}

...

class Person{

public Person(String name, int id, float salary){
this.name = name;
this.id = id;
this.salary = salary;
}
public Float getSalary() {
return salary;
}
public void setSalary(Float salary) {
this.salary = salary;
}
String name;
Float salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
int id;


@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}

if(this == obj){
return true;
}

if(obj instanceof Person){

Person person = (Person)obj;

if((person.getName().equals(name)) && person.getId() == id
&& person.getSalary() == salary){
return true;
}
}
return false;
}


@Override
public int hashCode() {
int hashCode = 1;
hashCode = 31 * hashCode + name.hashCode();
hashCode = 31 * hashCode + id;
hashCode = 31 * hashCode + salary.intValue();
return hashCode;
}

@Override
public String toString() {
return "Name :" + name + ", id : " + id;
}
}

我编写了以下程序。关于哈希码实现有点困惑,

  1. 为什么我们在实现中使用 31
  2. 根据 equals 方法逻辑,该程序应该返回 p2(Naveen, 21) 实例,但它返回 null。为什么?

最佳答案

您从 map 中获取 null,因为工资存储为 Float(而不是 float),并且您正在比较 Float code> 实例与 == 而不是将它们与 equals() 进行比较。

因此,Person 的 equals() 方法检查两个 Person 实例中是否存在完全相同的 Float 实例,而不是检查他们的工资值是否相等。您应该使用 float (或更好:double),除非工资可以为空(您还应该考虑使用 BigDecimal 来处理确切的金额)。但在这种情况下,您必须检查 Person.equals() 中是否为 null,并使用 equals() 来比较工资。在 Java 7 或更高版本中,最简单的方法是使用 Objects.equals() 来比较可为 null 的对象:

@Override
public boolean equals(Object obj) {
if(obj == null){
return false;
}

if(this == obj){
return true;
}

if(obj instanceof Person){

Person person = (Person)obj;

return Objects.equals(name, person.name)
&& id == person.id
&& Objects.equals(salary, person.salary);
}
return false;
}


@Override
public int hashCode() {
return Objects.hash(name, id, salary);
}

关于java - 哈希码在java中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20029160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com