java提高篇(二四)—–HashSet

转载自 java提高篇(二四)—–HashSet 

 

  在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素。所以如果对HashMap比较熟悉,那么HashSet是so  easy!!

一、定义

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

    HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。其中AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。Set接口是一种不包括重复元素的Collection,它维持它自己的内部排序,所以随机访问没有任何意义。

     基本属性

//基于HashMap实现,底层使用HashMap保存所有元素private transient HashMap<E,Object> map;//定义一个Object对象作为HashMap的valueprivate static final Object PRESENT = new Object();
基于HashMap实现,底层使用HashMap保存所有元素private transient HashMap<E,Object> map;//定义一个Object对象作为HashMap的valueprivate static final Object PRESENT = new Object();

     构造函数

/*** 默认构造函数* 初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。*/public HashSet() {map = new HashMap<>();}/*** 构造一个包含指定 collection 中的元素的新 set。*/public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}/*** 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子*/public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}/*** 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。*/public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}/*** 在API中我没有看到这个构造函数,今天看源码才发现(原来访问权限为包权限,不对外公开的)* 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。* dummy 为标识 该构造函数主要作用是对LinkedHashSet起到一个支持作用*/HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}* 默认构造函数* 初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。*/public HashSet() {map = new HashMap<>();}/*** 构造一个包含指定 collection 中的元素的新 set。*/public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}/*** 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子*/public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}/*** 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。*/public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}/*** 在API中我没有看到这个构造函数,今天看源码才发现(原来访问权限为包权限,不对外公开的)* 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。* dummy 为标识 该构造函数主要作用是对LinkedHashSet起到一个支持作用*/HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}

     从构造函数中可以看出HashSet所有的构造都是构造出一个新的HashMap,其中最后一个构造函数,为包访问权限是不对外公开,仅仅只在使用LinkedHashSet时才会发生作用。

二、方法

     既然HashSet是基于HashMap,那么对于HashSet而言,其方法的实现过程是非常简单的。

public Iterator<E> iterator() {return map.keySet().iterator();}Iterator<E> iterator() {return map.keySet().iterator();}

    iterator()方法返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。底层调用HashMap的keySet返回所有的key,这点反应了HashSet中的所有元素都是保存在HashMap的key中,value则是使用的PRESENT对象,该对象为static final。

public int size() {return map.size();}int size() {return map.size();}

   size()返回此 set 中的元素的数量(set 的容量)。底层调用HashMap的size方法,返回HashMap容器的大小。

public boolean isEmpty() {return map.isEmpty();}boolean isEmpty() {return map.isEmpty();}

    isEmpty(),判断HashSet()集合是否为空,为空返回 true,否则返回false。

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

    contains(),判断某个元素是否存在于HashSet()中,存在返回true,否则返回false。更加确切的讲应该是要满足这种关系才能返回true:(o==null ? e==null : o.equals(e))。底层调用containsKey判断HashMap的key值是否为空。

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

    add()如果此 set 中尚未包含指定元素,则添加指定元素。如果此Set没有包含满足(e==null ? e2==null : e.equals(e2)) 的e2时,则将e2添加到Set中,否则不添加且返回false。由于底层使用HashMap的put方法将key = e,value=PRESENT构建成key-value键值对,当此e存在于HashMap的key中,则value将会覆盖原有value,但是key保持不变,所以如果将一个已经存在的e元素添加中HashSet中,新添加的元素是不会保存到HashMap中,所以这就满足了HashSet中元素不会重复的特性。

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

remove如果指定元素存在于此 set 中,则将其移除。底层使用HashMap的remove方法删除指定的Entry。

public void clear() {map.clear();}void clear() {map.clear();}

clear从此 set 中移除所有元素。底层调用HashMap的clear方法清除所有的Entry。

public Object clone() {try {HashSet<E> newSet = (HashSet<E>) super.clone();newSet.map = (HashMap<E, Object>) map.clone();return newSet;} catch (CloneNotSupportedException e) {throw new InternalError();}}Object clone() {try {HashSet<E> newSet = (HashSet<E>) super.clone();newSet.map = (HashMap<E, Object>) map.clone();return newSet;} catch (CloneNotSupportedException e) {throw new InternalError();}}

clone返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。

后记:

由于HashSet底层使用了HashMap实现,使其的实现过程变得非常简单,如果你对HashMap比较了解,那么HashSet简直是小菜一碟。有两个方法对HashMap和HashSet而言是非常重要的,下篇将详细讲解hashcode和equals。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

$router VS $route

$router是一个VueRouter的实例 可以导航到不同的路由里 $route是$router跳转到的当前一个对象&#xff0c;里面包含该对象的path、query、name 、params 用法 &#xff1a; this.$router.push() 跳转到指定的url 会向history栈添加一个记录 点击后退会返回上一页面 1、this.…

Invalid character found in the request target. The valid characters are defi

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 问题 ApiOperation(value "根据排污口类型获取所有企业排污口信息和经度和纬度", notes "获取所有企业排污口信息和经度和纬度") PostMappin…

大咖微课 | 直面Angular2系列课第二期开讲

1.背景介绍&#xff1a;Angular1.x与Angular2 近年来&#xff0c;Web 开发技术的发展日新月异&#xff0c;各种框架层出不穷。在这样的大背景之下&#xff0c;2010年10月&#xff0c;Google 首次发布了自己的 Web 开发框架&#xff0c;名为 AngularJS&#xff0c;也叫 Angular&…

java实现遍历树形菜单方法——struts.xml实现

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts><package …

HashMap在java并发中如何发生死循环

转载自 HashMap在java并发中如何发生死循环 在多线程环境中&#xff0c;使用HashMap进行put操作时会引起死循环&#xff0c;导致CPU使用接近100%&#xff0c;下面通过代码分析一下为什么会发生死循环。 首先先分析一下HashMap的数据结构&#xff1a;HashMap底层数据结构是有一…

计算机和影视结合专业,计算机专业专业建设总结与典型案例2.5微电影拍摄与后期制作(影视拍摄与后期制作技术)课....

计算机专业专业建设总结与典型案例2.5微电影拍摄与后期制作(影视拍摄与后期制作技术)课. (11页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分微电影拍摄与后期制作(影视拍摄与后期制作技术)…

SpringBoot +Vue前后端分离(笔记)

前后端分离简介 前后端分离 前后端分离就是将⼀个应⽤的前端代码和后端代码分开写&#xff0c;为什么要这样做&#xff1f; 如果不使⽤前后端分离的⽅式&#xff0c;会有哪些问题&#xff1f; 传统的 Java Web 开发中&#xff0c;前端使⽤ JSP 开发&#xff0c;JSP 不是由后…

JAVA代码实现按列表中元素的时间字段排序 左联表后缺失数据 多字段进行排序

Data ApiModel(value "EstateListVo", description "小区列表") public class EstateListVo implements Serializable {private static final long serialVersionUID 4969589185044044369L;ApiModelProperty("小区ID")private Long estateId;…

.NET Core下使用gRpc公开服务(SSL/TLS)

一、前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息&#xff0c;而随之而来的就是一波关于.NET Core下如何使用的教程&#xff0c;但是在这众多的教程中基本都是泛泛而谈&#xff0c;难以实际在实际环境中使用&#xff0c;而该篇教程以gRpc为主&#xff0c;但是使用…

HashMap jdk1.7源码阅读与解析

转载自 HashMap源码阅读与解析 一、导入语 HashMap是我们最常见也是最长使用的数据结构之一&#xff0c;它的功能强大、用处广泛。而且也是面试常见的考查知识点。常见问题可能有HashMap存储结构是什么样的&#xff1f;HashMap如何放入键值对、如何获取键值对应的值以及如何…

如何兼容html在不同分辨力的问题,现代教育技术练习题

2009年秋期《现代教育技术》理论基础知识综合练习题一、单项选择题1、教育技术是关于学习过程和学习资源的()五个领域的理论与实践。A&#xff0e;开发、应用、购置、建构、评价B&#xff0e;组织、设计、实验、管理、辅导C&#xff0e;开发、应用、管理、设计、评价D&#xff…

2013蓝桥杯-B-省赛-六-三部排序

六、三部排序 package com.markerhub;public class TEST { // 负数都靠左端&#xff0c;正数都靠右端&#xff0c;0在中部static void sort(int[] x) //解题技巧&#xff1a;边猜测、边验证、逐步推理逻辑//极限思维 全是0 --> p //填空题&#xff1a;一般就一行代码…

java实现加密电话号码,有具体的加密流程注释

闲着没事做&#xff0c;正好有一位哥们让帮他看个写个逻辑题&#xff0c;我就顺便写了下&#xff01; 此题主要是加密一个数字类型的电话号码&#xff0c;具体加密流程如下&#xff1a; * 将一串数字进行加密 * 加密规则&#xff1a;先把这串数字降序&#xff0c;然后将每个…

.NET项目版本号的小随笔

【题外话】 一直以来都对.NET项目中的几个版本号&#xff08;AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion&#xff09;以及版本号中的Revision和Build有疑问&#xff0c;今儿抽了点时间看了几篇文章&#xff0c;整理一下与大家一起分享下。 【一、Ass…

Java实现最电话号码的简单加密源码

废话已经在 java实现加密电话号码&#xff0c;有具体的加密流程注释 这里面说了&#xff0c;这篇文章我就直接上代码了&#xff01; 请看&#xff1a; /** * Title: TestMain.java * Package org.test * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A1…

进程和线程关系及区别

转载自 进程和线程关系及区别 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只…

铜仁学院计算机报名,铜仁学院2012年3月全国计算机等级考试报名时间通知

2012年3月全国计算机等级考试有关事宜的通知各系(部)、现代教育技术中心、计财处&#xff1a;2012年3月全国计算机等级考试将于2012年3月24日&#xff0d;25日举行&#xff0c;按照教育部考试中心和贵州省考试中心的要求&#xff0c;我院计算机考试报名准备工作从2011年12月1日…

2013蓝桥杯-B-省赛-七、错误票据

七、错误票据 package com.markerhub;import java.util.Scanner; import java.util.ArrayList; import java.util.Collections;public class TEST { //解题思路&#xff1a;枚举public static void main(String[] args) {Scanner sc new Scanner(System.in);int N sc.nextI…

Windows.etc\hosts文件

Windows.etc\hosts文件 ZC&#xff1a;就是将 后面的项 重定位到 前面的项 1、目录&#xff1a;"C:\Windows\System32\drivers\etc" 文件&#xff1a;"C:\Windows\System32\drivers\etc\hosts" 2、c__Windows_System32_drivers_etc_hosts的作用 - Sharpe…

Java多线程:实现方式Thread与Runnable

转载自 Java多线程:实现方式 在Java中, 多线程的实现有两种方式&#xff1a;扩展java.lang.Thread类实现java.lang.Runnable接口 方法1 /** * Description: 继承Thread类, 实现多线程. * author snoopy * blog http://blog.csdn.net/huang_xw */ package basic.a_start; …