区别 |
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"
博客围绕HashSet展开,指出在将对象存储于HashSet前,需重写hashCode()和equals()方法,以比较对象值是否相等,避免集合中存储相同对象。还提到Set添加元素的add方法,元素值重复时返回 'false',添加成功返回 'true'。

1万+

被折叠的 条评论
为什么被折叠?



