【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别
【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使用区别相关推荐
- 集合{LinkedHashMap TreeMap HashSet LinkedHashSet TreeSet 快速失败机制 ConcurrentHashMap CAS 多线程协同扩容}(二)
目录标题 LinkedHashMap Map集合框架结构体系图 什么是LinkedHashMap Linked 链式 的意思 HashMap "哈希映射"的意思 LinkedHas ...
- 集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet
集合之Collection家族的 List接口+LinkedList+Vector+Stack及Set接口+HashSet+LinkedHashSet+TreeSet 一.LinkedList 1.L ...
- Java基础之equals和==的区别深入解析
Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...
- HashSet 和 TreeSet的区别
HashSet 和 TreeSet的区别 HstSet和TreeSet详解 HashSet 内部是由哈希表(实际上是一个 HashMap 实例)支持的.它不保证 set 元素的迭代顺序. TreeSe ...
- Java集合框架:Set(HashSet,LinkedHashSet,TreeSet)
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)
关注微信公众号:CodingTechWork,一起学习进步. Set集合介绍 Set集合的概念 Set集合类似于一个容器,程序把很多对象保存到Set集合中,Set集合对添加顺序不记录,当有重复的对 ...
- [Java基础]HashSet集合概述和特点
HashSet集合概述和特点: 练习代码如下: package HashSetPackage;import java.util.HashSet;public class HashSetDemo {pu ...
- java基础数据类型与String类型区别
区别:Java内存存放位置不一样,基本数据类型存在栈(stack),String的对象实例存在堆(heap).另外String,不是基本数据类型,判断是否相等,不能使用==,而应该使用equals方法 ...
- JavaSE Set HashSet LinkedHashSet TreeSet 集合练习
day17目录: SetHashSetLinkedHashSetTreeSet 集合练习 17.08_集合框架(Set集合概述及特点)(掌握) A:Set集合概述及特点: 通过API查看即可 B: 案 ...
- Java基础 - Integer和int的区别
一.int和Integer的区别 两者的区别主要体现在以下几个方面: 1.数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型: 2.默认值不同:int 的默认值是 0,而 Int ...
最新文章
- [原][osg]osgconv浅析
- 在 Redis 中设置了过期时间的 Key,需要注意哪些问题?
- VOFM、Copy Control与合并开票
- 图像处理--角点检测与匹配
- 51Nod 1179 最大的最大公约数
- Alsa中PCM参数设置
- GC 调优(实战篇) - GC参考手册
- Visual Basic之父回忆往事
- Apache2.4项目配置PHP/TP项目方法
- 记录一次json转换的经历
- Scanner、String(java基础知识十二)
- CSS:模拟实现QQ浏览器
- Sharepoint对List增删改操作
- UE4 中文文档阅读
- 思科模拟器简单校园网设计,期末作业难度
- 编译原理 第3版 第一章练习
- 副本技能-邮箱SMTP,IMAP,POP3协议说明及各类邮箱协议配置地址与端口
- Matter.js 2D 物理引擎试玩报告
- 在服务器上打不开新点投标文件,新点投标文件制作操作手册.doc
- sniffer安装问题
热门文章
- 梯度下降算法以及线性回归模型
- 软件设计师-数据库( 分布式)
- 快升级 iOS 10.3.1,修补了致命WiFi安全漏洞!
- [LeetCode]题解(python):012-Integer to Roman
- Bootstrap-基于jquery的bootstrap在线文本编辑器插件Summernote
- C#基础知识整理:基础知识(11) 值类型,引用类型
- 【转】什么是磁珠(Ferrite Bead 即 FB)
- [导入]写了个img2ppt的demo,为写PDF2PPT做准备
- 创建表的时候要添加目标语句use
- ARMLINUX学习笔记(3)---安装交叉编译器