HashSet与HashMap的联系和区别
HashSet:
HashSet实现了Set接口,不允许集合中出现重复的元素。
HashMap:
HashMap实现了Map接口,Map接口对键和值进行映射,不允许出现重复的键
HashMap通过散列表来存储对象,由数组+链表/红黑树的结构组成组成,数组的一个元素为一个哈希桶。
存储对象时,会调用hashCode()方法计算出哈希值(int),通过对哈希值取余的方式得到哈希桶的位置,若哈希值冲突,则在每个哈希桶采用链表/红黑树结构进行存储。
散列表的初始容量为16,散列因子为0.75,即占用容量达到初始容量的0.75时,散列表便会自动扩容。初始容量和散列因子可通过HashMap的构造方法来设置
HashMap在存储对象时,会先通过hashCode()方法计算对象的哈希值,哈希值决定了对象该放在哪个桶中。如果再有一个对象存储在这个桶里,通过equals判断两个对象是否是同一对象,若是,则覆盖,若不是,则在该数组下标里通过链表存储(超过8个后,通过红黑树存储)。
对象作为键存储,这也就解释了为什么键不能重复。
HashSet去除重复元素的原理:HashSet基于HashMap的结构进行存储,HashSet是一个 值都相等的但键不同 的HashMap,HashSet在存储键时,会根据equals去除重复的键。
HashSet或HashMap在存储对象时,要重写 equals() 和 hashCode() 方法,hashCode()用来确定对象在散列表中的存储地址,equals()则保证了对象不重复。
若两个对象的hashCode相等,不一定equals,反过来则一定。