ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JAVA集合系列之-HashSet

2021-08-20 20:33:46  阅读:165  来源: 互联网

标签:map JAVA HashMap HashSet Object initialCapacity 集合 public


1. HashSet 简介

  • HashSet 是个包装HashMap的一种数据结构,HashSet的大部分的方法都是依靠找HashMap的方法,在内部结构没有特别复杂的实现,在方法的实现中没有synchronized关键字修饰,所以是线程不安全的
  • HashSet继承了AbstractMap、实现了Map、Cloneable、Serializable接口
  • 继承了AbstractMap的接口,HashSet就有了增、删、改、查、判空、迭代器等功能
  • 实现了Cloneable接口则说明HashSet支持Object的clone的方法,如果不继承调用clone方法会抛出CloneNotSupportedException的错误,看了下源码,是native方法实现的
  • 实现了Serializable接口则说明HashSet能够被序列化和反序列化,能够在网络中进行传输

2. HashSet 数据结构

 HashSet的继承关系

java.lang.Object
   ↳     java.util.Map<E>
         ↳     java.util.AbstractMap<E>
               ↳     java.util.HashSet<E>

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {}

3. HashSet 主要方法说明

public class HashSet<E>   
 extends AbstractSet<E>   
 implements Set<E>, Cloneable, java.io.Serializable   
{   
 // 使用 HashMap 的 key 保存 HashSet 中所有元素  
 private transient HashMap<E,Object> map;   
 // 定义一个虚拟的 Object 对象作为 HashMap 的 value   
 private static final Object PRESENT = new Object();   
 ...   
 // 初始化 HashSet,底层会初始化一个 HashMap   
 public HashSet()   
 {   
     map = new HashMap<E,Object>();   
 }   
 // 以指定的 initialCapacity、loadFactor 创建 HashSet   
 // 其实就是以相应的参数创建 HashMap   
 public HashSet(int initialCapacity, float loadFactor)   
 {   
     map = new HashMap<E,Object>(initialCapacity, loadFactor);   
 }   
 public HashSet(int initialCapacity)   
 {   
     map = new HashMap<E,Object>(initialCapacity);   
 }   
 HashSet(int initialCapacity, float loadFactor, boolean dummy)   
 {   
     map = new LinkedHashMap<E,Object>(initialCapacity   
         , loadFactor);   
 }   
 // 调用 map 的 keySet 来返回所有的 key   
 public Iterator<E> iterator()   
 {   
     return map.keySet().iterator();   
 }   
 // 调用 HashMap 的 size() 方法返回 Entry 的数量,就得到该 Set 里元素的个数  
 public int size()   
 {   
     return map.size();   
 }   
 // 调用 HashMap 的 isEmpty() 判断该 HashSet 是否为空,  
 // 当 HashMap 为空时,对应的 HashSet 也为空  
 public boolean isEmpty()   
 {   
     return map.isEmpty();   
 }   
 // 调用 HashMap 的 containsKey 判断是否包含指定 key   
 //HashSet 的所有元素就是通过 HashMap 的 key 来保存的  
 public boolean contains(Object o)   
 {   
     return map.containsKey(o);   
 }   
 // 将指定元素放入 HashSet 中,也就是将该元素作为 key 放入 HashMap   
 public boolean add(E e)   
 {   
     return map.put(e, PRESENT) == null;   
 }   
 // 调用 HashMap 的 remove 方法删除指定 Entry,也就删除了 HashSet 中对应的元素  
 public boolean remove(Object o)   
 {   
     return map.remove(o)==PRESENT;   
 }   
 // 调用 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素  
 public void clear()   
 {   
     map.clear();   
 }   
 ...   
}   

4. HashSet 总结

 

  • 内部实现是使用HashMap进行实现,
  • 线程不安全
  • 存放数据是无序的
  • 存放的数据是唯一的

标签:map,JAVA,HashMap,HashSet,Object,initialCapacity,集合,public
来源: https://www.cnblogs.com/zzq919101/p/15168040.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有