今天来说说Java集合中的Set系列之HashSet。
 
Set我们众所周知的就是虑重功能, 我们平时在项目开发中也常用到这个特性的。那么Set为何能够虑重呢? 接下来我们就看下源码吧。
 
Set的底层实现是HashMap(这个后面讲Map时也会讲它的源码), 当我们在HashSet中添加一个新元素时, 其实这个值是存储在底层Map的key中,而众所周知,HashMap的key值是不能重复的, 所以这里就可以达到去重的目的了。
 
直接看下HashSet的源码:

 
当我们new 一个HashSet实例时, 其实底层是新创建了一个HashMap实例。 放入HashSet中的集合元素实际上由HashMap的key来保存,而HashMap的value则存储了一个PRESENT,它是一个静态的Object对象。
 
下面说下HashSet需要注意的地方:
我们在项目中经常会对一些DTO进行虑重, 那么我们必须要重写equals和hashCode方法,具体可参见我的另一篇文章:重写equals就必须重写hashCode的原理分析
 
下面拿一个我在项目中DTO虑重的实例:
/**
* 新车上市相关DTO
* Created by WangMeng on 2017/8/9.
*/
public class NewListedCarDTO {
/**
* id
*/
private long id;
/**
* 车系id
*/
private long seriesId;
/**
* 头条文章id
*/
private long teleId;
/**
* 车系显示名称
*/
private String seriesTitle;
/**
* 车系标签
*/
private String seriesTag;
/**
* 上市时间
*/
private String listTime; /**
* 上市状态
* 0:不可用 1:即将上市 2:已经上市
*/
private int articleType; private int listYear; private int listMonth; @Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof NewListedCarDTO)) return false; NewListedCarDTO that = (NewListedCarDTO) o; if (seriesId != that.seriesId) return false;
if (listYear != that.listYear) return false;
return listMonth == that.listMonth;
} @Override
public int hashCode() {
int result = (int) (seriesId ^ (seriesId >>> 32));
result = 31 * result + listYear;
result = 31 * result + listMonth;
return result;
} public long getId() {
return id;
} public void setId(long id) {
this.id = id;
} public long getSeriesId() {
return seriesId;
} public void setSeriesId(long seriesId) {
this.seriesId = seriesId;
} public long getTeleId() {
return teleId;
} public void setTeleId(long teleId) {
this.teleId = teleId;
} public String getSeriesTitle() {
return seriesTitle;
} public void setSeriesTitle(String seriesTitle) {
this.seriesTitle = seriesTitle;
} public String getSeriesTag() {
return seriesTag;
} public void setSeriesTag(String seriesTag) {
this.seriesTag = seriesTag;
} public String getListTime() {
return listTime;
} public void setListTime(String listTime) {
this.listTime = listTime;
} public int getArticleType() {
return articleType;
} public void setArticleType(int articleType) {
this.articleType = articleType;
} public int getListYear() {
return listYear;
} public void setListYear(int listYear) {
this.listYear = listYear;
} public int getListMonth() {
return listMonth;
} public void setListMonth(int listMonth) {
this.listMonth = listMonth;
}
}

这里要根据seriesId和listMonth这两个字段去重, 所以必须重写equals和hashCode方法。

Java中常见数据结构Set之HashSet的更多相关文章

  1. Java中常见数据结构List之ArrayList

    这里主要包含ArrayList和LinkedList, 然后再添加一个:CopyOnWriteArrayList 关于Java中的集合内容, 感觉都已经被写烂了, 我这里主要是做个复习, 再从扒下源代 ...

  2. Java中常见数据结构:list与map -底层如何实现

    1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构 ...

  3. Java中常见数据结构:list与map

    1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...

  4. Java中常见数据结构Map之LinkedHashMap

    前面已经说完了HashMap, 接着来说下LinkedHashMap. 看到Linked就知道它是有序的Map,即插入顺序和取出顺序是一致的, 究竟是怎样做到的呢? 下面就一窥源码吧. 1, Link ...

  5. Java中常见数据结构Map之HashMap

    之前很早就在博客中写过HashMap的一些东西: 彻底搞懂HashMap,HashTableConcurrentHashMap关联: http://www.cnblogs.com/wang-meng/ ...

  6. Java中常见数据结构List之LinkedList

    二,LinkedList 1, linkedList底层数据结构 linkedList底层是一个双向链表 2,LinkedList和ArrayList的对比 1.顺序插入速度ArrayList会比较快 ...

  7. Java中常见数据结构

    1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...

  8. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  9. java中的数据结构(集合|容器)

    对java中的数据结构做一个小小的个人总结,虽然还没有到研究透彻jdk源码的地步.首先.java中为何需要集合的出现?什么需求导致.我想对于面向对象来说,对象适用于描述任何事物,所以为了方便对于对象的 ...

随机推荐

  1. ETL作业调度工具TASKCTL软件安装乱码问题解决

    前两天在安装批量作业调度软件TASKCTL4.5时,将安装介质解压出来后执行安装脚本时,一安装就出现下图乱码. 然后就度娘了一下,发现安装遇到乱码的人还挺多的,大多数解答都说TASKCTL软件里面很多 ...

  2. 强连通分量tarjan缩点——POJ2186 Popular Cows

    这里的Tarjan是基于DFS,用于求有向图的强联通分量. 运用了一个点dfn时间戳和low的关系巧妙地判断出一个强联通分量,从而实现一次DFS即可求出所有的强联通分量. §有向图中, u可达v不一定 ...

  3. 亚马逊AWS EC2云实例AMI安装LNMP环境(1)——Nginx安装

    概括:这里选择亚马逊EC2的Linux AMI实例,该Linux服务器是亚马逊预配置的Linux环境,内置多个YUM源,属于亚马逊首推的稳定Linux服务器.默认登录用户名为ec2-user,执行ro ...

  4. Eclipse常用快捷键大全

    1.ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母

  5. CentOS服务器运维监控Nagios(一)

    CentOS下搭建Nagios 王尚 2014.11.09 操作系统:CentOS-6.5-i386-bin-DVD1.iso 安装在VM中进行测试的. 本章需要的软件链接: php-5.3.2.ta ...

  6. unable to create …

    问题描述: 在新建Android Application时会出现unable to create the selected property page 解决方法: 将用户PATH路径中的jdk路径放到 ...

  7. Open-Falcon第六步安装Dashboard(小米开源互联网企业级监控系统)

    安装Dashboard dashboard是面向用户的查询界面,在这里,用户可以看到push到graph中的所有数据,并查看其趋势图. yum install -y python-virtualenv ...

  8. swift UITextView内容距离边框边距设置

    des_textView.textContainerInset = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10) 设置对应的四个边距的值

  9. NYOJ--488--dfs--素数环

    /* Name: NYOJ--488--素数环 Author: shen_渊 Date: 15/04/17 15:30 Description: DFS,素数打个表,37以内就够用了 */ #incl ...

  10. c++ static用法总结【转载】

    static关键字是C, C++中都存在的关键字.static从字面理解,是“静态的“的 意思,与此相对应的,应该是“动态的“. static的作用主要有以下3个: 1.扩展生存期: 2.限制作用域: ...