首页 > 代码库 > java 17 - 4 HashCode()保证元素唯一性的代码体现以及图解

java 17 - 4 HashCode()保证元素唯一性的代码体现以及图解

当我们想要创建一个集合,该集合里面的元素都具有唯一性时。会遇到两种情况:

  A:元素为String类型,可以直接用Hashset<String>集合来创建

      String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。

  B:当元素为自定义对象的时候,那么,就要在这个对象的类中重写hashCode()和equals()方法

  下图是思路:

技术分享

 

其实,扯了这么多,上面那些只要理解思路就行了。。。这玩意不用自己写

在类上面 Alt+Shift+s ,再点h,就能生成相对应的重写的hashCode()和equls()方法了

 

代码体现:

 

首先创建一个对象类:

 1 package zl_HashCode; 2  3 public class Animal { 4      5     private String name; 6     private String color; 7     private int age; 8     public Animal() { 9         super();10         // TODO Auto-generated constructor stub11     }12     public Animal(String name, String color, int age) {13         super();14         this.name = name;15         this.color = color;16         this.age = age;17     }18     public String getName() {19         return name;20     }21     public void setName(String name) {22         this.name = name;23     }24     public String getColor() {25         return color;26     }27     public void setColor(String color) {28         this.color = color;29     }30     public int getAge() {31         return age;32     }33     public void setAge(int age) {34         this.age = age;35     }36     @Override37     public int hashCode() {38         final int prime = 31;39         int result = 1;40         result = prime * result + age;41         result = prime * result + ((color == null) ? 0 : color.hashCode());42         result = prime * result + ((name == null) ? 0 : name.hashCode());43         return result;44     }45     @Override46     public boolean equals(Object obj) {47         if (this == obj)48             return true;49         if (obj == null)50             return false;51         if (getClass() != obj.getClass())52             return false;53         Animal other = (Animal) obj;54         if (age != other.age)55             return false;56         if (color == null) {57             if (other.color != null)58                 return false;59         } else if (!color.equals(other.color))60             return false;61         if (name == null) {62             if (other.name != null)63                 return false;64         } else if (!name.equals(other.name))65             return false;66         return true;67     }68     69     70 }

 

具体测试类:

 1 package zl_HashCode; 2 /* 3   HashSet集合存储自定义对象并遍历。如果对象的成员变量值相同即为同一个对象 4   5      注意了: 6          你使用的是HashSet集合,这个集合的底层是哈希表结构。 7          而哈希表结构底层依赖:hashCode()和equals()方法。 8          如果你认为对象的成员变量值相同即为同一个对象的话,你就应该重写这两个方法。 9          如何重写呢?不同担心,自动生成即可。10 */11 import java.util.HashSet;12 13 public class HashCodeTest1 {14 15     public static void main(String[] args) {16         17         HashSet<String> hs = new HashSet<String>();18         //首先导入String类型的元素,看效果19         hs.add("阿猫");20         hs.add("阿狗");21         hs.add("花花");22         hs.add("阿猫");23         hs.add("阿狗");24         hs.add("草草");25         //遍历集合126         for(String s1 : hs){27             //HashSet集合中存储String类型,元素会唯一性28             System.out.println(s1);//花花草草阿狗阿猫29         }30         31         HashSet<Animal> ha = new HashSet<Animal>();32         33         //再创建自定义对象的元素并导入34         Animal a1 = new Animal("荷兰猪","粉白",2);35         Animal a2 = new Animal("泰迪犬","棕色",1);36         Animal a3 = new Animal("哈士奇","白色",3);37         Animal a4 = new Animal("荷兰猪","粉白",2);38         Animal a5 = new Animal("泰迪犬","棕色",2);39         Animal a6 = new Animal("荷兰猪","黑白",2);40         41         ha.add(a1);42         ha.add(a2);43         ha.add(a3);44         ha.add(a4);45         ha.add(a5);46         ha.add(a6);47         48         for(Animal a : ha){49             System.out.println(a.getName()+"\t"+a.getColor()+"\t"+a.getAge());50             /*  对象类中重写了hashCode()和equals()方法,只让存储进唯一元素51                   若是不重写,则由于每个自定义对象的hashCode值不一样,所以都能存储进去52                       泰迪犬    棕色    153             泰迪犬    棕色    254             荷兰猪    粉白    255             哈士奇    白色    356             荷兰猪    黑白    257              */58         }59     }60 61 }

 

java 17 - 4 HashCode()保证元素唯一性的代码体现以及图解