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 stub
11     }
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     @Override
37     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     @Override
46     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         //遍历集合1
26         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                       泰迪犬    棕色    1
53             泰迪犬    棕色    2
54             荷兰猪    粉白    2
55             哈士奇    白色    3
56             荷兰猪    黑白    2
57              */
58         }
59     }
60
61 }
时间: 2024-12-09 03:01:13

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

HashSet保证元素唯一性的代码体现(源码和内部图 进行解析)

--------------------------------------------------------------- 测试类: /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同,则为同一个元素. *  * 目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法. * 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类. * 这个时候,他们的哈希值是不会一样的,根本就不会进行后

Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)

1. TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序) (1)Student.java: 1 package cn.itcast_07; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super(); 13 thi

Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解

1. TreeSet保证元素唯一性和自然排序的原理和图解

解说HashSet如何保证元素的唯一性

HashSet底层数据结构是哈希表,哈希表按哈希值来存储,HashSet集合中有若干个存储区域,而每个对象可以计算出一个hash值,系统会自动将这个值分组,对应若干个存储区域.当添加新元素时,系统会计算出这个元素的hash值,然后跟存储区域的每一个元素进行比较,如果不相同则添加该新元素.如果相同再equals比较,若为false,则添加该元素. 简单说就是同过元素的两个方法,hashcode()和equals()来完成,如果元素的hashCode值相同,再判断equals是否为true,若为tr

HashSet集合是如何保证元素的唯一性的?

HashSet集合的特点是元素无序和不重复 . 首先,HashSet的底层数据结构是哈希表.哈希表就是存储一系列哈希值的表,而哈希值是由对象的hashCode()方法生成的. 确保元素唯一性的两个方法,hashCode()和equals()方法. 当调用add()方法向集合中存入对象的时候,先比较此对象与原有对象的哈希值有没有一样的,如果都不一样就直接存入:如果有与之相同的哈希值,则要继续比较这两个对象是否为同一个对象,此时就要调用对象的equals()方法了. 总之,只有HashCode的至相

Java Web学习(17):JSP动作元素(二)

<jsp:include>动作元素 (1)<jsp:include>动作元素 <jsp:include>动作元素用来包含静态和动态的文件.该动作把指定文件插入正在生成的页面. <jsp:include>动作元素语法格式如下: <jsp:include page="相对URL地址" flush="true" />    前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而

千万不要误用 java 中的 HashCode 方法

刚才debug追堆栈的时候发现一个很奇怪的问题 我用IE8和Google的浏览器访问同一个地址 Action的 scope="session" 也设置了 而且两个浏览器提交的参数map也是互相独立的 不过很奇怪的一个 两个Action对象的hashmap是不同的但是它们的对象变量 paraterMap 的 哈希值 居然是一个 我大不解!( 找到原因以后发现这个问题其实只是一个好多年没有再提起的基础问题 ) 不过发现确实有朋友在网上说这个问题曾经引发过bug Java中的hashCode

Java Map 如何实现Key 的唯一性?

大家都知道,在Map和Set不可存在重复元素? 但是对于内部的细节我们并不了解,今天我们就一块来 探讨一下! 1 对于 HashMap  HashSet 他们的底层数据结构的实现是:维护了一张  HashTable .容器中的元素全部存储在Hashtable 中.他们再添加元素的时候,是如何判断是否存在有重复元素的呢?  每一个被添加的元素都有一个 hashCode(哈希值),他们先比较哈希值,是否相同? 不相同的元素,添加进入 HashTable.   如果hashCode相同的话, 再去比较

Java中的HashCode(1)之hash算法基本原理

Java中的HashCode(1)之hash算法基本原理 2012-11-16 14:58:59     我来说两句      作者:woshixuye 收藏    我要投稿 一.为什么要有Hash算法 Java中 的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素 是否重复应该依据什么来判断呢?用Object.equals方法.但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的