大家好,我是孤焰。今天要谈一谈在面试过程中几乎被每个面试官都会提到的一个问题——HashMap和HashSet的区别是什么?
由于我也是刚刚学习编程的小白,所以此篇博文将参考了多篇博文,最后总结而成。
1.什么是HashMap?
1.1什么是HashMap?
HashMap是存储Key-Value键值对的集合,每个键值对也叫做Entry,这些Entry分散存储在一个数组中,这个数组可以称是HashMap的主干。
HashMap中的每一个元素的初始值都是NULL,且默认数组长度是16
HashMap有两个主要方法:GET 和 PUT。
V get(Object key) 方法:返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
V put(K key, V value) 方法:向数组中添加键值对(Entry)。
1.2HashMap的特点有哪些?
HashMap具有以下4条特点:
- HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射
- HashMap采用了数组和链表的数据结构(在JDK1.8之后采用数组和红黑树),能在查询和修改方便继承了数组的线性查找和链表的寻址修改
- HashMap是非synchronized,所以HashMap很快,HashMap是非线程安全的
- HashMap可以接受null键和值,而Hashtable则不能(原因就是equlas()方法需要对象,因为HashMap是后出的API经过处理才可以)
2.什么是HashSet?
2.1什么是HashSet?
HashSet底层基于HashMap实现(不信的话可以看源码),但HashSet存的只是对象,HashMap存的是键值对。
HashSet不允许集合中出现重复元素,在使用HashSet存储对象之前,要确保重写hashCode()方法和equals()方法
2.2HashSet的特点有哪些?
HashSet具有以下4条特点:
- 无序性(HashMap也有这条特点)
- 唯一性(允许使用null)
- 本质上来讲就是hashmap
- 需要重写hashcode()方法和equals()方法
3.HashMap与HashSet的区别?
HashMap | HashSet |
---|---|
HashMap实现了Map接口 | HashSet实现了Set接口 |
HashMap存储键值对 | HashSet仅仅存储对象 |
使用put()方法将键值对放入Map中 | 使用add()方法将对象放入Set中 |
HashMap中使用键对象来计算hashcode值 | HashSet中使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equalse()方法用来判断对象的相等性 |