Object 里面有个hashcode 方法
如以下代码:
package com.collectiondo;
class Person {
private Integer age;
private String name;
public Person(Integer age, String name) {
this.age = age;
this.name = name;
}
}
public class TestHash {
public static void main(String[] args) {
Person person1 = new Person(19,"路飞");
Person person2 = new Person(19,"路飞");
System.out.println("person1:"+person1.hashCode());//1173230247
System.out.println("person2:"+person2.hashCode());//1173230247
//String 重写了hashcode的方法
String m=new String("路飞");
String n="路飞";
System.out.println("m:"+m.hashCode());//1165519
System.out.println("n:"+n.hashCode());//1165519
//这两个是特殊的
String str1 = "通话";
String str2 = "重地";
System.out.println("通话:"+"通话".hashCode());//哈希值1179395
System.out.println("重地:"+"重地".hashCode());//哈希值1179395
}
}
hashset 存储数据的结构如下图
hashset 不能存重复元素的原理,如下图
用hashset 存储自定义类型的数据(比如自己定义的对象,person ,student)
以下是示例:
package com.collectiondo; import java.util.HashSet; import java.util.Set; class Person { private Integer age; private String name; public Person(Integer age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "Person{" + "age=" + age + ", name=‘" + name + ‘\‘‘ + ‘}‘; } } public class TestHash { public static void main(String[] args) { Set pset=new HashSet<Person>(); Person person1 = new Person(19,"路飞"); Person person2 = new Person(19,"路飞");
pset.add(person1); pset.add(person2);
System.out.println("person1:"+person1.hashCode());//1173230247 System.out.println("person2:"+person2.hashCode());//1173230247 System.out.println("pset:"+pset); }
输出结果是:
person1:1173230247
person2:856419764
pset:[Person{age=19, name=‘路飞‘}, Person{age=19, name=‘路飞‘}]
从输出的结果可以看出来,两个person 虽然里面的name 和age 属性的值都是一样的,但是由于hashcode 是不一样的,所以被认为是不同的两个实例。
显然这样是不合适的。所以我们要来改造一下person 类,在person 类里面重写hashcode 方法和equals方法
class Person { private Integer age; private String name; public Person(Integer age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "Person{" + "age=" + age + ", name=‘" + name + ‘\‘‘ + ‘}‘; } //重写equals方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age.equals(person.age) && name.equals(person.name); } //重写hashCode方法 @Override public int hashCode() { return Objects.hash(age, name); } }
测试代码:
public class TestHash { public static void main(String[] args) { Set pset=new HashSet<Person>(); Person person1 = new Person(19,"路飞"); Person person2 = new Person(19,"路飞"); Person person3= new Person(18,"娜美"); Person person4 = new Person(20,"索隆"); Person person5 = new Person(21,"山治"); pset.add(person1); pset.add(person2); pset.add(person3); pset.add(person4); pset.add(person5); System.out.println("person1:"+person1.hashCode());//1173230247 System.out.println("person2:"+person2.hashCode());//1173230247 System.out.println("pset:"+pset); } }
输出的结果是:
person1:1167069
person2:1167069
pset:[Person{age=18, name=‘娜美‘}, Person{age=19, name=‘路飞‘}, Person{age=21, name=‘山治‘}, Person{age=20, name=‘索隆‘}]
原文:https://www.cnblogs.com/codinggege/p/13571220.html