快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → HashSet集合与hashCode方法重写

HashSet集合与hashCode方法重写

时间:2020-02-28 10:07:06人气:作者:快盘下载我要评论

一、Set集合

1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构。

2.哈希表又称为散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表,每个单向链表都有一个独一无二的hash值,代表数组的下标。在某个单向链表中的每一个节点上的hash值是相等的,hash值实际上是key调用hashCode方法,再通过"hash function"转化成的值。

3.如何向哈希表中添加元素

先调用被存储的key的hashCode方法,经过某个算法得出的hash值,如果在这个哈希表中不存在这个hash值,则直接加入元素。如果该hash值已经存在,继续调用key之间的equals方法,如果equals方法返回false,则将该元素添加。如果equals方法返回true,则放弃添加该元素。

4.HashSet其实是HashMap中的key部分,HashSet有什么特点,HashMap中的key应该具有相同的特点。

5.HashMap和HashSet初始化容量都是16,默认加载因子0.75

package com.bjpowernode.java_learning;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
public class D88_2_ {
  public static void main(String[] args) {
    Set s = new HashSet();
    s.add(1);
    s.add(1);
   
    s.add(100);
    Iterator i = s.iterator();
    while(i.hasNext()) {
      System.out.println(i.next());
    } 
  }
}

HashSet集合与hashCode方法重写

二、重写hashCode和equals方法(有一个原则:散列均匀分布)

package com.bjpowernode.java_learning;
import java.util.*;
public class D88_2_HasCodeAndEqualsMethod {
  public static void main(String[] args) {
    //创建集合
    Set s = new HashSet();
    Employee88 e1 = new Employee88("1000","Jack");
    Employee88 e2 = new Employee88("1001","Jack");
    Employee88 e3 = new Employee88("1001","Scott");
    Employee88 e4 = new Employee88("1000","Jack");
    Employee88 e5 = new Employee88("3000","JIN");
    Employee88 e6 = new Employee88("3001","Cook");
    //添加元素
    s.add(e1);
    s.add(e2);
    s.add(e3);
    s.add(e4);
    s.add(e5);
    s.add(e6);
   
    System.out.println(s.size());
  }
}
//根据现实的业务逻辑可以得知,该公司的员工编号是:1000-9999
class Employee88{
  //编号
  String no;
  //姓名
  String name;
  //Constructor
  Employee88(String no,String name){
    this.no = no;
    this.name = name;
  }
  //我们下面重写了hashCode方法的目的就是:
  //能够对同工号同名字的员工判断为同一个元素
  //如果不重写hashCode方法,那么会对对象的内存地址进行hashCode计算,这样就不会有相同的元素了
  //重写hashCode方法之后,相同的hashCode值,就会接下来的判断
  //也就是重写equals方法
  //如果员工编号相同,并且名字相同,则是同一个对象
  public boolean equals(Object o) {
    if(this==o) {
      return true;
    }
    if(o instanceof Employee88) {
      Employee88 e = (Employee88)o;
      if(e.no.equals(this.no) && e.name.equals(this.name)) {
        return true;
      }
    }
    return false;
  }
 
  //重写hashCode方法
  public int hashCode() {
    //以员工编号分组
    return no.hashCode();
  }
}

解释:六个对象里面有一个完全相同,因此会输出五个元素;如果不重写的话,就会输出六个元素。

总结:存储在HashSet集合或者HashMap集合key部分的元素,需要同时重写hashCode和equals方法

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。