关于何时重写hashCode(),怎样重写hashCode()

时间:2021-08-15 16:01:47
我一直没能弄明白何时重写hashCode(),怎样重写hashCode()。我现在明白的有:生成两个对象同时,会生成对应的散列码,当需要比较两个对象时,java先比较他们的hashCode,若不同,则两个对象就不同,若相同,再比较equals()方法,判断是否相同。
可是我还是没能弄明白上面的那两个问题。
各位帅哥帮我解决一下好吗,最好能举一下例子,或则用一些形象的比喻比较好理解。先谢过了!!!!

15 个解决方案

#1


你可以用myeclipse自动帮你重写equals()方法和hashCode();

#2


怎么操作叫下,说明白些,3Q!
引用楼主  的回复:
我一直没能弄明白何时重写hashCode(),怎样重写hashCode()。我现在明白的有:生成两个对象同时,会生成对应的散列码,当需要比较两个对象时,java先比较他们的hashCode,若不同,则两个对象就不同,若相同,再比较equals()方法,判断是否相同。
可是我还是没能弄明白上面的那两个问题。
各位帅哥帮我解决一下好吗,最好能举一下例子,或则用一些形象的比喻比较好理解。先谢过了!!……

#3


怎么操作教下,说明白写,谢谢
引用 1 楼  的回复:
你可以用myeclipse自动帮你重写equals()方法和hashCode();

#4


java 里有个超类,就是所有的类都继承至那个类,叫Object。这个知道不?这个类有equals和hashCode方法,所以你要做一些你自定义的比较,你就要重写这些方法,明白?说说你不明白的地方

#5


看到你标题了,给你写了个代码,有不懂的留言
public class Person {
int age;

@Override
public boolean equals(Object obj) {
//按照你想要的方法去比较,比如我这里比较的是年龄,年龄相等就返回true
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.age==p.age?true:false;
}

public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.age=1;
p2.age=1;
System.out.println(p1.equals(p2));//如果没有重写equals方法,Object默认是比较他们的引用,所以返回的是false,你可以试试

}
}

#6


1、你首先要明白原理。明白为什么要重新hashcode和equals方法。
2、至于如何重写,这个要具体问题具体对待。

#7


equals()方法我还是比较懂的,就是hashCode()比较不懂,你在举个hashCode的例子把。
引用 5 楼  的回复:
看到你标题了,给你写了个代码,有不懂的留言
Java code
public class Person {
    int age;
    
    @Override
    public boolean equals(Object obj) {
        //按照你想要的方法去比较,比如我这里比较的是年龄,年龄相等就返回true
        if(!(obj instance……

#8


打个比方,hashCode() 方法是好比是字典前面的目录,有了这个目录你查东西就会快的多,equals方法是比较的内容,就好比根据目录查内容。同一个的内容自然要有唯一的目录,所以hashCode和equals方法一般一起实现。比如Student类的equals方法根据name,school,age重写的,那么hashCode也要根据这三个属性去散列存储的地址。hash表的数据结构是链表的数组,即每个数组元素都是一个链表,链表中存的是hashCode值相等的元素,所以根据hashCode能快速的查找。Eclipse有自动生成的写法,你可以自己生成看看。但是hashCode的具体写法要依据情况去写,没固定写法。

#9


楼上那个人已经说得不错了。你知道Set这个集合是不能存相同内容的吗?它判断相同内容的依据就是存进去的这个对象与set这个集合里面存在的各个对象的hashcode比较是否相同。如果相同,就存不进去。
我大概写个例子吧
public class Person {
int age;
String name;

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

@Override
public boolean equals(Object obj) {
System.out.println(this.name+":调用equals,想用什么方式比较自己写");
Person p = (Person)obj;
return this.age==p.age?true:false;
}
@Override
public int hashCode() {
System.out.println(this.name+":先调用hashCode,想用什么方式比较自己写,若想同,再调用equals");
return age;
}

public static void main(String[] args) {
HashSet<Person> persons = new HashSet<Person>();
Person p1=new Person("a",1);
Person p2=new Person("b",1);
Person p3=new Person("c",2);
persons.add(p1);
persons.add(p2);
persons.add(p3);
for(Person p:persons){
System.out.println(p.age);
}
}

}
我比较相同的依据是年龄相同

#10


程序自己运行一下。比较是否“同一对个对象”的依据就是:如果hashcode不相同,就能存进去;如果hashcode相同,则再比较equals,如果equals相同,则不能存进去,如果equals不同,则还是能存进去

#11


btw.这分数太不好赚了,都传授了这么多,最高也就20分。你看我发贴都是一百分的:D

#12


引用 3 楼  的回复:
怎么操作教下,说明白写,谢谢引用 1 楼  的回复:

你可以用myeclipse自动帮你重写equals()方法和hashCode();

1.Think in java这书里有具体说明
2.Myeclipse(或Eclipse中)快捷键:alt+shift+s 然后再点h就可以帮你自动生成hashcode和equals方法。alt+shift+s再点s会自动帮你生成tostring方法。

#13


覆盖equals时总要覆盖hashcode.

查看Effective java 一书第9条建议,给出了一种hashcode的简单覆盖方案,本来想贴出来的,太长了,你自己看吧

#14


引用 11 楼 BaronZ 的回复:
btw.这分数太不好赚了,都传授了这么多,最高也就20分。你看我发贴都是一百分的:D
哈哈

#15


引用 11 楼 BaronZ 的回复:
btw.这分数太不好赚了,都传授了这么多,最高也就20分。你看我发贴都是一百分的:D

笑翻了!

#1


你可以用myeclipse自动帮你重写equals()方法和hashCode();

#2


怎么操作叫下,说明白些,3Q!
引用楼主  的回复:
我一直没能弄明白何时重写hashCode(),怎样重写hashCode()。我现在明白的有:生成两个对象同时,会生成对应的散列码,当需要比较两个对象时,java先比较他们的hashCode,若不同,则两个对象就不同,若相同,再比较equals()方法,判断是否相同。
可是我还是没能弄明白上面的那两个问题。
各位帅哥帮我解决一下好吗,最好能举一下例子,或则用一些形象的比喻比较好理解。先谢过了!!……

#3


怎么操作教下,说明白写,谢谢
引用 1 楼  的回复:
你可以用myeclipse自动帮你重写equals()方法和hashCode();

#4


java 里有个超类,就是所有的类都继承至那个类,叫Object。这个知道不?这个类有equals和hashCode方法,所以你要做一些你自定义的比较,你就要重写这些方法,明白?说说你不明白的地方

#5


看到你标题了,给你写了个代码,有不懂的留言
public class Person {
int age;

@Override
public boolean equals(Object obj) {
//按照你想要的方法去比较,比如我这里比较的是年龄,年龄相等就返回true
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.age==p.age?true:false;
}

public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.age=1;
p2.age=1;
System.out.println(p1.equals(p2));//如果没有重写equals方法,Object默认是比较他们的引用,所以返回的是false,你可以试试

}
}

#6


1、你首先要明白原理。明白为什么要重新hashcode和equals方法。
2、至于如何重写,这个要具体问题具体对待。

#7


equals()方法我还是比较懂的,就是hashCode()比较不懂,你在举个hashCode的例子把。
引用 5 楼  的回复:
看到你标题了,给你写了个代码,有不懂的留言
Java code
public class Person {
    int age;
    
    @Override
    public boolean equals(Object obj) {
        //按照你想要的方法去比较,比如我这里比较的是年龄,年龄相等就返回true
        if(!(obj instance……

#8


打个比方,hashCode() 方法是好比是字典前面的目录,有了这个目录你查东西就会快的多,equals方法是比较的内容,就好比根据目录查内容。同一个的内容自然要有唯一的目录,所以hashCode和equals方法一般一起实现。比如Student类的equals方法根据name,school,age重写的,那么hashCode也要根据这三个属性去散列存储的地址。hash表的数据结构是链表的数组,即每个数组元素都是一个链表,链表中存的是hashCode值相等的元素,所以根据hashCode能快速的查找。Eclipse有自动生成的写法,你可以自己生成看看。但是hashCode的具体写法要依据情况去写,没固定写法。

#9


楼上那个人已经说得不错了。你知道Set这个集合是不能存相同内容的吗?它判断相同内容的依据就是存进去的这个对象与set这个集合里面存在的各个对象的hashcode比较是否相同。如果相同,就存不进去。
我大概写个例子吧
public class Person {
int age;
String name;

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

@Override
public boolean equals(Object obj) {
System.out.println(this.name+":调用equals,想用什么方式比较自己写");
Person p = (Person)obj;
return this.age==p.age?true:false;
}
@Override
public int hashCode() {
System.out.println(this.name+":先调用hashCode,想用什么方式比较自己写,若想同,再调用equals");
return age;
}

public static void main(String[] args) {
HashSet<Person> persons = new HashSet<Person>();
Person p1=new Person("a",1);
Person p2=new Person("b",1);
Person p3=new Person("c",2);
persons.add(p1);
persons.add(p2);
persons.add(p3);
for(Person p:persons){
System.out.println(p.age);
}
}

}
我比较相同的依据是年龄相同

#10


程序自己运行一下。比较是否“同一对个对象”的依据就是:如果hashcode不相同,就能存进去;如果hashcode相同,则再比较equals,如果equals相同,则不能存进去,如果equals不同,则还是能存进去

#11


btw.这分数太不好赚了,都传授了这么多,最高也就20分。你看我发贴都是一百分的:D

#12


引用 3 楼  的回复:
怎么操作教下,说明白写,谢谢引用 1 楼  的回复:

你可以用myeclipse自动帮你重写equals()方法和hashCode();

1.Think in java这书里有具体说明
2.Myeclipse(或Eclipse中)快捷键:alt+shift+s 然后再点h就可以帮你自动生成hashcode和equals方法。alt+shift+s再点s会自动帮你生成tostring方法。

#13


覆盖equals时总要覆盖hashcode.

查看Effective java 一书第9条建议,给出了一种hashcode的简单覆盖方案,本来想贴出来的,太长了,你自己看吧

#14


引用 11 楼 BaronZ 的回复:
btw.这分数太不好赚了,都传授了这么多,最高也就20分。你看我发贴都是一百分的:D
哈哈

#15


引用 11 楼 BaronZ 的回复:
btw.这分数太不好赚了,都传授了这么多,最高也就20分。你看我发贴都是一百分的:D

笑翻了!