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

HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;

LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;

TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。

用例代码:

package com.test;  

import java.util.HashSet;  import java.util.LinkedHashSet;  import java.util.TreeSet;  

/**   * @description 几个set的比较   *    HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;   *    LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;   *    TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。   * @author Zhou-Jingxian   *  */  public class SetDemo {  

public static void main(String[] args) {  

        HashSet<String> hs = new HashSet<String>();          hs.add("B");          hs.add("A");          hs.add("D");          hs.add("E");          hs.add("C");          hs.add("F");          System.out.println("HashSet 顺序:\n"+hs);  

        LinkedHashSet<String> lhs = new LinkedHashSet<String>();          lhs.add("B");          lhs.add("A");          lhs.add("D");          lhs.add("E");          lhs.add("C");          lhs.add("F");          System.out.println("LinkedHashSet 顺序:\n"+lhs);  

        TreeSet<String> ts = new TreeSet<String>();          ts.add("B");          ts.add("A");          ts.add("D");          ts.add("E");          ts.add("C");          ts.add("F");          System.out.println("TreeSet 顺序:\n"+ts);      }  }  

输出效果:

HashSet 顺序:[D, E, F, A, B, C] LinkedHashSet 顺序:[B, A, D, E, C, F]TreeSet 顺序:[A, B, C, D, E, F]

HashSet的输出结果分析:

hashset的实现,依据的是hashmap,

举个hashset源码的小例子:

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

所以我们分析hashmap的源码:

public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key.hashCode());int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;}

最为重要的就是:hash的生成算法和indexfor确定的table[i]的下标:

static int hash(int h) {// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);}/*** Returns index for hash code h.*/static int indexFor(int h, int length) {return h & (length-1);}

这样,就解释了为什么hashset的输出如此不同,它是根据hash值的生成策略来存储在散列表中的。

hashmap的源码,是根据transient Entry[] table;以及生成entry内部类,来实现散列表的。

当然,我们在做应用时,也可以使用linkedList[],来实现散列表。

代码如下:

public class HashTest {static final int tablesize = 13;LinkedList<Integer>[] listTable;String[] s = new String[12];public void load(Iterator<Integer> it) {listTable = (LinkedList<Integer>[])new LinkedList[tablesize];while(it.hasNext()) {Integer temp = it.next();int n = hash(temp);if(listTable[n] == null) {listTable[n] = new LinkedList<Integer>();}listTable[n].add(temp);}}private int hash(Integer temp) {
//      int v = temp.hashCode(); //比较对象(字符串)时,取得hash值int v = temp;       return v % tablesize;}private boolean search(Integer v) {int h = hash(v);LinkedList<Integer> ll = listTable[h];if(ll == null) return false;return ll.contains(v);}public static void main(String[] args) {HashTest ht = new HashTest();List<Integer> li = new ArrayList<Integer>();for(int i=0;i<10000;i++) {li.add(i);}ht.load(li.iterator());int a = 10000;if(ht.search(a)) {System.out.println("yes");} else {System.out.println("no");}
//      HashSet<String> hs = new HashSet<String>();
//      hs.add("D");
//      hs.add("B");
//      hs.add("E");
//      hs.add("A");
//      hs.add("F");
//      hs.add("C");
//      System.out.println(hs);
//
//      System.out.println(17 & 16);}}

【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别相关推荐

  1. 集合{LinkedHashMap TreeMap HashSet LinkedHashSet TreeSet 快速失败机制 ConcurrentHashMap CAS 多线程协同扩容}(二)

    目录标题 LinkedHashMap Map集合框架结构体系图 什么是LinkedHashMap Linked 链式 的意思 HashMap "哈希映射"的意思 LinkedHas ...

  2. 集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet

    集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet 一.LinkedList 1.L ...

  3. Java基础之equals和==的区别深入解析

    Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...

  4. HashSet 和 TreeSet的区别

    HashSet 和 TreeSet的区别 HstSet和TreeSet详解 HashSet 内部是由哈希表(实际上是一个 HashMap 实例)支持的.它不保证 set 元素的迭代顺序. TreeSe ...

  5. Java集合框架:Set(HashSet,LinkedHashSet,TreeSet)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    关注微信公众号:CodingTechWork,一起学习进步. Set集合介绍 Set集合的概念   Set集合类似于一个容器,程序把很多对象保存到Set集合中,Set集合对添加顺序不记录,当有重复的对 ...

  7. [Java基础]HashSet集合概述和特点

    HashSet集合概述和特点: 练习代码如下: package HashSetPackage;import java.util.HashSet;public class HashSetDemo {pu ...

  8. java基础数据类型与String类型区别

    区别:Java内存存放位置不一样,基本数据类型存在栈(stack),String的对象实例存在堆(heap).另外String,不是基本数据类型,判断是否相等,不能使用==,而应该使用equals方法 ...

  9. JavaSE Set HashSet LinkedHashSet TreeSet 集合练习

    day17目录: SetHashSetLinkedHashSetTreeSet 集合练习 17.08_集合框架(Set集合概述及特点)(掌握) A:Set集合概述及特点: 通过API查看即可 B: 案 ...

  10. Java基础 - Integer和int的区别

    一.int和Integer的区别 两者的区别主要体现在以下几个方面: 1.数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型: 2.默认值不同:int 的默认值是 0,而 Int ...

最新文章

  1. [原][osg]osgconv浅析
  2. 在 Redis 中设置了过期时间的 Key,需要注意哪些问题?
  3. VOFM、Copy Control与合并开票
  4. 图像处理--角点检测与匹配
  5. 51Nod 1179 最大的最大公约数
  6. Alsa中PCM参数设置
  7. GC 调优(实战篇) - GC参考手册
  8. Visual Basic之父回忆往事
  9. Apache2.4项目配置PHP/TP项目方法
  10. 记录一次json转换的经历
  11. Scanner、String(java基础知识十二)
  12. CSS:模拟实现QQ浏览器
  13. Sharepoint对List增删改操作
  14. UE4 中文文档阅读
  15. 思科模拟器简单校园网设计,期末作业难度
  16. 编译原理 第3版 第一章练习
  17. 副本技能-邮箱SMTP,IMAP,POP3协议说明及各类邮箱协议配置地址与端口
  18. Matter.js 2D 物理引擎试玩报告
  19. 在服务器上打不开新点投标文件,新点投标文件制作操作手册.doc
  20. sniffer安装问题

热门文章

  1. 梯度下降算法以及线性回归模型
  2. 软件设计师-数据库( 分布式)
  3. 快升级 iOS 10.3.1,修补了致命WiFi安全漏洞!
  4. [LeetCode]题解(python):012-Integer to Roman
  5. Bootstrap-基于jquery的bootstrap在线文本编辑器插件Summernote
  6. C#基础知识整理:基础知识(11) 值类型,引用类型
  7. 【转】什么是磁珠(Ferrite Bead 即 FB)
  8. [导入]写了个img2ppt的demo,为写PDF2PPT做准备
  9. 创建表的时候要添加目标语句use
  10. ARMLINUX学习笔记(3)---安装交叉编译器