【java】HashSet与HashMap的区别
程序员文章站
2022-07-03 20:01:41
区别HashSetHashMap接口实现Set接口实现Map接口存储存储对象存储键值对底层原理基于HashMap(注释①)数组+链表调用方法使用add()方法将元素放入Set中public boolean add(Object obj)使用put()方法将元素放入Map中p......
区别 |
HashSet |
HashMap |
接口 | 实现Set接口 | 实现Map接口 |
存储 | 存储对象 | 存储键值对 |
底层原理 | 基于HashMap(注释①) |
数组+链表 |
调用方法 | 使用add()方法将元素放入Set中 public boolean add(Object obj) |
使用put()方法将元素放入Map中 public Object put(Object Key,Object value) |
hashcode | 使用成员对象来计算hashcode值 (注释②) |
使用键对象来计算hashcode值 |
速度 | 相对慢 | 较快,因为使用唯一的键来获取对象 |
重复性 | 不能包含重复数据。Set接口是一种一个不包含重复元素的collection | 键值不能重复 |
框架 | collection | collection |
注释①:collection
HashSet的源码:
//HashSet底层用来存储元素的结构,实际上使用HashMap来存储
private transient HashMap<E,Object> map;
//HashMap中的value值,HashSet只关注key值,所以所有的value值都为Object对象
private static final Object PRESENT = new Object();
//HashSet的无参构造,直接创建了一个HashMap对象
public HashSet() {
map = new HashMap<>();
}
注释②:
当我们提到HashSet时,第一件事就是在将对象存储在HashSet之前,要确保重写hashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有
储存相同的对象。如果不重写上述两个方法,那么将使用下面方法默认实现:
public boolean add(Object obj)方法用在Set添加元素时,如果元素值重复时返回 "false",如果添加成功则返回"true"
本文地址:https://blog.csdn.net/sarah25/article/details/110430849