HashSet注意事项

package cn.kcn.set;
/*
 *  Set集合:HashSet
 *  
 *  1、HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构;
 *  2、哈希表又叫散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单链表,
 *      每个单链表都有一个唯一的hash值,代表“数组的下标”,
 *      在某个单链表中的每个节点上的hash值是相等的,
 *      hash值实际上是key调用hashCode方法,在通过“哈希函数”转换成的值;
 *  3、如何向哈希表中添加元素:
 *      先调用被存储的key的hashCode方法,经过某个算法得出hash值,
 *      如果在这个哈希表中不存在这个hash值,则直接加入元素,如果该
 *      hash值已经存在,继续调用key之间的equals方法,如果equals
 *      方法返回false,则将该元素添加,否则放弃添加;
 *  4、HashSet其实是HashMap中的key部分,HashSet具有的特点HashMap中的key都应该具有相同的特点;
 *  5、HashMap和HashSet初始化容量都是16,默认加载因子是0.75(如:总容量为100,那么到占用75个后开始考虑扩容)。
 *
 *  总结:存储在HashSet集合或者HashMap集合key部分的元素,需要同时重写hashCode和equals方法。
 */
import java.util.*;

public class hashSetTest01 {

    public static void main(String[] args) {
        //创建Set集合
        Set s = new HashSet();

        Employee e1 = new Employee("1000","zhangsan");
        Employee e2 = new Employee("1000","zhangsan");
        Employee e3 = new Employee("2000","lisi");
        Employee e4 = new Employee("2001","wangwu");
        Employee e5 = new Employee("3000","zhaoliu");
        Employee e6 = new Employee("3001","sunqi");
        //无序不可重复
        s.add(e1);
        s.add(e2);
        s.add(e3);
        s.add(e4);
        s.add(e5);
        s.add(e6);

        System.out.println(s.size());

        //遍历集合
        Iterator it = s.iterator();
        while(it.hasNext()){
            System.out.println(it.next().toString());
        }
    }

}
//员工类
class Employee{
    String no;
    String name;
    //构造方法
    Employee(String no,String name){
        this.no = no;
        this.name = name;
    }
    //重写toString方法
    public String toString() {
        return "no="+no+"...."+"name="+name;
    }
    //重写hashCode方法,使散列分布均匀
    public int hashCode(){
        return no.hashCode();
    }
    //重写equals方法
    //如果员工编号相同,并且名字相同,则是同一个对象
    public boolean equals(Object o){
        if(this==o){
            return true;
        }
        if(o instanceof Employee){
            Employee e = (Employee)o;
            if(e.no.equals(this.no) && e.name.equals(this.name)){
                return true;
            }
        }
        return false;
    }
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值