前言

HashSet

HashSet有以下特点
—— 不能保证元素的排列顺序,顺序有可能发生变化
—— 不是同步的
—— 集合元素可以是null,但只能放入一个null
当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。
简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等
注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。

LinkedHashSet

LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。


测试案例

public void hashTest(){// HashSet不保证集合的迭代顺序;也许在某些时间迭代的顺序与插入顺序一致,但是不保证该顺序恒久不变。Set<String> mSetString = new HashSet<String>();// LinkedHashSet按照元素插入的顺序进行迭代,LinkedHashSet不是线程安全的。Set<String> mLinkedSetString = Collections.synchronizedSet(new LinkedHashSet<String>());for (int i = 0; i < 30; i++) {mSetString.add(String.valueOf(i));mLinkedSetString.add(String.valueOf(i));}System.out.println("***********HashSet for String***************");Iterator<String> setStringIt = mSetString.iterator();while(setStringIt.hasNext()) {System.out.print(setStringIt.next() + " ");}System.out.println();System.out.println("***********LinkedHashSet for String***************");Iterator<String> linkedSetStringIt = mLinkedSetString.iterator();while(linkedSetStringIt.hasNext()) {System.out.print(linkedSetStringIt.next() + " ");}System.out.println();}

输出日志如下

2021-01-14 14:21:39.154 32383-32383/com.zjrc.cba2 I/System.out: ***********HashSet for String***************
2021-01-14 14:21:39.156 32383-32383/com.zjrc.cba2 I/System.out: 22 23 24 25 26 27 28 29 10 11 12 13 14 15 16 17 18 19 0 1 2 3 4 5 6 7 8 9 20 21
2021-01-14 14:21:39.156 32383-32383/com.zjrc.cba2 I/System.out: ***********LinkedHashSet for String***************
2021-01-14 14:21:39.157 32383-32383/com.zjrc.cba2 I/System.out: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

从输出结果看:

HastSet迭代的顺序与插入的顺序不一致;
LinkedHashSet迭代的顺序与插入的顺序一致;

HashSet和LinkedHashSet的比较使用相关推荐

  1. Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet

    Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...

  2. 源码分析-HashSet、LinkedHashSet

    基本特性 HashSet的是依靠组合一个HashMap实现的.然后讲大部分任务都委托给HashMap完成.  当然,HashSet不保证迭代顺序与添加顺序相同,而且也不保证其顺序不变.允许空元素.  ...

  3. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

    前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...

  4. Java 之HashSet、LinkedHashSet、TreeSet比较

    4.HashSet.LinkedHashSet.TreeSet比较 Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不 ...

  5. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  6. 【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别

    [JAVA基础]HashSet.LinkedHashSet.TreeSet使用区别 HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHash ...

  7. HashSet、LinkedHashSet、TreeSet

    以下内容基于jdk1.7.0_79源码: 关于HashSet.LinkedHashSet.TreeSet Set接口的实现类,最大特点是不允许出现重复元素: HashSet:基于HashMap实现,一 ...

  8. 进阶07 Set接口、HashSet、LinkedHashSet

    java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充 ...

  9. HashSet及LinkedHashSet源码分析(基于JDK1.6)

    Java容器类的用途是"保存对象",分为两类:Map--存储"键值对"组成的对象:Collection--存储独立元素.Collection又可以分为List和 ...

  10. 14.1 常见数据结构、List集合(ArrayList、LinkedList)、Set集合(HashSet、LinkedHashSet)、可变参数方法

    目录 常见的数据结构 栈 队列 数组 链表 红黑树 二叉树binary tree List集合 List接口中常用方法 列:List接口常用方法练习 ArrayList集合 LinkedList集合 ...

最新文章

  1. SSH免密登录详细操作步骤
  2. 第13章:项目合同管理(2)-章节重点
  3. parzen窗估计如何进行结果分析_实现一下模式识别(一)Parzen窗估计
  4. 如何传输文件到linux服务器?
  5. C++ const用法 尽可能使用const
  6. Java中的String,StringBuilder,StringBuffer的区别
  7. 7-125 切分表达式——写个tokenizer吧 (20 分)
  8. php array_flip() 删除数组重复元素——大彻大悟
  9. 微软sql服务器开机自启,使用 SQL Server 服务启动选项
  10. 什么才是一份好的AI求职简历?
  11. 【编程小题目6】字符数统计
  12. python和java哪个好-Python和Java哪个好?有什么区别?
  13. 计算机硬盘扇区修复,w7硬盘坏道修复详细教程
  14. 微信动态二维码管理引流源码/微信活码/自动换群/微信朋友圈加群二维码
  15. Mybatis基础学习之万能的Map和模糊查询
  16. 语音识别第4讲:语音特征参数MFCC
  17. 『杭电1859』最小长方形
  18. centos查看进程及结束掉
  19. 基于Apache math3 的遗传算法计算复杂函数在定义域内的最值
  20. 大数据在油气行业的应用前景展望(二)

热门文章

  1. 阿里云服务器ECS安装Docker提示:No match for argument: docker-ce,No match for argument: docker-ce-cli
  2. 【python】python的命令行调试工具—pdb(python debugger)
  3. Exchange server 2016 无人值守安装
  4. 好事多磨!《轩辕剑》电视剧版几经周折即将开机
  5. 清华有个能写诗的机器人
  6. 美团2020暑期实习——前端电话面试回顾
  7. ArcGIS基础(三):建筑可达性街道活力分析
  8. spring security webflux 自定义登录页面
  9. 装载HTML 5 Boilerplate 5.0 中文文档
  10. android最新版本 note8,2017年度十大旗舰盘点 安卓阵营成功逆袭