文档章节

HashSet

妹子快加微信
 妹子快加微信
发布于 2017/08/29 22:29
字数 1100
阅读 34
收藏 1
点赞 0
评论 0

Base:JDK1.8

1、HashSet

前面说完了HashMap,说HashSet就很好说了,因为HashSet也是一个 哈希表组成的,更直接的说,它的底层是直接使用了 HashMap 做的。

HashSet 内容挺少的。

所以在这个上面就不写那么多了,重要的 都在HashMap 里面,不过作为两者的区别 ,还是要说的。

2、继承的类和实现的接口

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

 可以看出, HashSet 是 实现了set 接口,那么看下set 接口:

public interface Set<E> extends Collection<E> 

set接口 则是继承 Collection 接口的,因此它 是跟 List  是兄弟,跟Map 没啥关系,都是集合。

不过要知道的是 List  是一个 有序的 集合,而HashSet 是一个无序的集合。

在这里 要知道, 有序 无序,并不是指的 排序,而是指的  存入顺序,有一个存入先后的 概念,而set 是没有的。

上面都是基于数据结构说的,HashMap也是无序的。

因此,在HashSet中是没有 get() 这种方法的。

3、HashMap中的成员变量、数据结构、常用方法

3.1 成员变量

private transient HashMap<E,Object> map;

你看,底层数组直接使用的就是 HashMap。。。

大家注意第二个是Object,第一个是泛型

// Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

这是一个 final 修饰的 Object 的常量。  我们都知道,HashMap 是基于 K-V形式

而 set 存的时候只放入一个 value ,那剩余的一个怎么办呢? 其实就是直接使用的这个常量代替的。

当然  我说的value  意思是  你把你存储的 东西当做是一个 value ,而在底层 ,则是将你存入的数据作为 Key值,而这个常量 Object 作为一个Value 存起来。

这个后面会用代码展现。

3.2 数据结构

private transient HashMap<E,Object> map;

这就很明显了, 是HashMap 的 数据结构。

3.3 常用方法

3.3.1 构造方法

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

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

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


    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

这几个构造方法直接全放一起吧,很简单。

3.3.2 add

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

这段代码 很自然的显示出了, put的时候, 你存入的数据作为一个key 值存入,而那个常量则作为一个 value 值存入。

这就造成了,set 不能存重复的东西,因为 HashMap 的 key 值是不能重复的。

3.3.3 get

当然,是没有get方法的。哈哈哈

3.3.4 remove

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

 

微总结:

ArrayList、LinkedList、HashSet 是都是来自Collection 的子类, 而HashMap 则是Map 的子类

因此这是需要主意的一点

ArrayList、LinkedList 是两个有序的,这 有序是 可以保存 存入时候的顺序,即在 不适用 add(v,index),表明插入下表的话,顺序就是保存的顺序,

而HashSet 、HashMap 则不在意 存入的顺序,因为会进行hash 算法,求取一个 index 放入到 哈希表中

而HashSet 又跟HashMap 正好有点相反的意思,虽然 HashSet 是基于HashMap 但是一个 HashSet 是把你存入的数据当做一个 key 存进去, HashMap则是 把存入的数据作为 value 存入。

HashMap 是 key值 不能相同  因此决定了 HashSet  不能存重复的值。

HashMap 计算的 哈希值 是你存入的 key 的哈希值,而HashSet  则是 使用的你 传入的 数据 计算的Hash值的,其实都是使用的key啦。。。。

ArrayList 跟 LinkedList 的性能有点一边倒。一个注重查询,一个注重插入,删除,当然: 数据量大。。。

如果你都是插入到最后,查询的都是 第一个,几乎是没有差距。。

HashSet 跟HashMap 两者都不能重复。第一个是 你存的数据不能是重复的, 第二个是 你存入的 key 值是不能重复。

HashMap 更重要,而且 据我现在的了解,貌似 key-value 形式 非常非常非常的常见,而且重要,用到的地方非常多。

 

-----------------------------------------------------------------------------

不保证代码完全正确,也不保证代码是最优。

仅仅是根据自己的理解,写出来直观的代码,方便理解。

错误请指出,感激不尽!

© 著作权归作者所有

共有 人打赏支持
妹子快加微信
粉丝 1
博文 21
码字总数 24963
作品 0
洛阳

暂无相关文章

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 16分钟前 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

楠木楠 ⋅ 28分钟前 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 57分钟前 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 58分钟前 ⋅ 0

Docker Toolbox Looks like something went wrong

Docker Toolbox 重新安装后提示错误:Looks like something went wrong in step ´Checking if machine default exists´ 控制面板-->程序与应用-->启用或关闭windows功能:找到Hyper-V,如果处......

随你疯 ⋅ 今天 ⋅ 0

Guacamole 远程桌面

本文将Apache的guacamole服务的部署和应用,http://guacamole.apache.org/doc/gug/ 该链接下有全部相关知识的英文文档,如果水平ok,可以去这里仔细查看。 一、简介 Apache Guacamole 是无客...

千里明月 ⋅ 今天 ⋅ 0

nagios 安装

Nagios简介:监控网络并排除网络故障的工具:nagios,Ntop,OpenVAS,OCS,OSSIM等开源监控工具。 可以实现对网络上的服务器进行全面的监控,包括服务(apache、mysql、ntp、ftp、disk、qmail和h...

寰宇01 ⋅ 今天 ⋅ 0

AngularDart注意事项

默认情况下创建Dart项目应出现以下列表: 有时会因为不知明的原因导致列表项缺失: 此时可以通过以下步骤解决: 1.创建项目涉及到的包:stagehand 2.执行pub global activate stagehand或pub...

scooplol ⋅ 今天 ⋅ 0

Java Web如何操作Cookie的添加修改和删除

创建Cookie对象 Cookie cookie = new Cookie("id", "1"); 修改Cookie值 cookie.setValue("2"); 设置Cookie有效期和删除Cookie cookie.setMaxAge(24*60*60); // Cookie有效时间 co......

二营长意大利炮 ⋅ 今天 ⋅ 0

【每天一个JQuery特效】淡入淡出显示或隐藏窗口

我是JQuery新手爱好者,有时间就练练代码,防止手生,争取每天一个JQuery练习,在这个博客记录下学习的笔记。 本特效主要采用fadeIn()和fadeOut()方法显示淡入淡出的显示效果显示或隐藏元...

Rhymo-Wu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部