问:简单谈谈你对 HashSet 原理的认识?
答:HashSet 在存元素时会调用对象的 hashCode 方法计算出存储索引位置,如果其索引位置已经存在元素(哈希碰撞)则和该索引位置上所有的元素进行 equals 比较,如果该位置没有其他元素或者比较的结果都为 false 就存进去,否则就不存。所以可以看见元素是按照哈希值来找位置的,所以是无序且可以保证无重复元素,因此我们在往 HashSet 集合中存储元素时,元素对象应该正确重写 Object 类的 hashCode 和 equals 方法,否则会出现不可预知的错误。
问:说说 HashSet 与 HashMap 的区别?
答:从实质上说 HashSet 的实现实质就是一个 Map 对象的包装,只是 Map 的 value 为 Object 固定对象,Set 只利用了 Map 的 key 而已。具体区别来说如下:
HashMap 实现了 Map 接口,而 HashSet 实现了 Set 接口。
HashMap 储存键值对,而 HashSet 仅仅存储对象。
HashMap 使用 put 方法将元素放入 Map 中,而 HashSet 使用 add 方法将元素放入 Set 中。
HashMap 中使用键对象来计算 hashcode 值,而 HashSet 使用成员对象来计算 hashcode 值。