HashSet
首先说一下Set,Set注重独一无二的性质,该体系的集合用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复,对象的相等本质是对象hashConde值(java是依据对象的内存地址计算出的此序号)判断的,如果想让两个不同的对象视为相等,就必须覆盖Object的hashCode方法和equals方法。
HashSet(Hash表):
哈希表存放的是哈希值,底层用HashMap实现,HashSet存储元素的顺序并不是按照存入时的顺序(和List不同),所以是无序的,它是按照哈希值来存的,所以取数据也是按照哈希值取,元素的哈希值是通过元素的hashcode方法来获取,HashSet首先判断两个元素的哈希值是否一样,如果一样的话,接着会比较equals方法,如果equals结果为true,HashSet就视为同一个 元素,如果equals为false则不为同一个元素,在哈希值相同,equals为false时,会在同样的哈希值下顺延(哈希值相同的元素放在一个哈希桶中),也就是哈希值一样的存一列,表1表示hashCode值不相同的情况,表2表示hashCode值相同,但是equals为false的情况。
表1
哈希表 | ||
元素1 | 元素2 | 元素3 |
表2
元素1 | 哈希表 |
元素2 | |
元素3 |
HashSet通过hashCode值来确定元素的内存中的位置,一个hashCode值上可以存放多个元素。