专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java编程技术分享,hashset方法原理

Java编程技术分享,hashset方法原理

更新时间:2020-05-26 16:20:17 来源:动力节点 浏览1749次

Java编程技术分享,hashset方法原理,HashMap作为底层数据结构实现的一种数据结构——HashSet。(如果不了解HashMap的实现原理,建议先看看HashMap,不然直接看HashSet是很难看懂的)。

1.HashSet定义

HashSet是一个由HashMap实现的集合。元素无序且不能重复。

 public class HashSet<E>
     extends AbstractSet<E>
     implements Set<E>, Cloneable, java.io.Serializable

Java编程技术分享,hashset方法原理

和前面介绍的大多数集合一样,HashSet也实现了Cloneable接口和Serializable接口,分别用来支持克隆以及支持序列化。还实现了Set接口,该接口定义了Set集合类型的一套规范。

2.字段属性

//HashSet集合中的内容是通过 HashMap 数据结构来存储的
private transient HashMap<E,Object> map;
//向HashSet中添加数据,数据在上面的 map 结构是作为 key 存在的,而value统一都是 PRESENT
private static final Object PRESENT = new Object();

第一个定义一个HashMap,作为实现HashSet的数据结构;第二个PRESENT对象,因为前面讲过HashMap是作为键值对key-value进行存储的,而HashSet不是键值对,那么选择HashMap作为实现,其原理就是存储在HashSet中的数据作为Map的key,而Map的value统一为PRESENT(下面介绍具体实现时会了解)。

3.构造函数

1)无参构造

public HashSet() {
   map = new HashMap<>();
 }

直接new一个HashMap对象出来,采用无参的HashMap构造函数,具有默认初始容量(16)和加载因子(0.75)。

2)指定初始容量

public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
​​​​​​​  }

3)指定初始容量和加载因子

public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
  }

4)构造包含指定集合中的元素

public HashSet(Collection<? extends E> c) {
   map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
   addAll(c);
 }

集合容量很好理解,这里我介绍一下什么是加载因子。在HashMap中,能够存储元素的数量就是:总的容量*加载因子,新增一个元素时,如果HashMap集合中的元素大于前面公式计算的结果了,那么就必须要进行扩容操作,从时间和空间考虑,加载因子一般都选默认的0.75。

4.添加元素

public boolean add(E e) {
   return map.put(e, PRESENT)==null;
  }

通过map.put()方法来添加元素,在上一篇博客介绍该方法时,说明了该方法如果新插入的key不存在,则返回null,如果新插入的key存在,则返回原key对应的value值(注意新插入的value会覆盖原value值)。

也就是说HashSet的add(E e)方法,会将e作为key,PRESENT作为value插入到map集合中,如果e不存在,则插入成功返回true;如果存在,则返回false。

5.删除元素

public boolean remove(Object o) {
 return map.remove(o)==PRESENT;
}

调用HashMap的remove(Object o)方法,该方法会首先查找map集合中是否存在o,如果存在则删除,并返回该值,如果不存在则返回null。

也就是说HashSet的remove(Object o)方法,删除成功返回true,删除的元素不存在会返回false。

6.查找元素

public boolean contains(Object o) {
return map.containsKey(o);
 }

调用 HashMap 的 containsKey(Object o) 方法,找到了返回 true,找不到返回 false。

7.遍历元素

HashSet<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
//增强for循环
for(Integer i : set){
  System.out.println(i);
}
//普通for循环
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next());
}

以上就是动力节点java培训机构的小编针对“Java编程技术分享,hashset方法原理”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>