【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); } }
相关推荐
本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...
比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序 5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新...
在Java编程语言中,集合框架是处理对象组的重要工具,其中`HashSet`和`TreeSet`是两种常见的接口实现类,分别提供了不同的功能和性能特性。本教程将深入探讨这两个集合类以及它们与比较器(Comparator)的关系。 ...
AbstractSet 抽象类SortedSet 接口HashSet LinkedHashSet TreeSet List 接口 AbstractList 和 AbstractSequentialList Vector Stack ArrayList LinkedList Queue接口Deque 接口 AbstractQueue 抽象类LinkedList ...
在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...
本文将深入探讨Java中四个主要的Set实现类:HashSet、LinkedHashSet、TreeSet以及EnumSet。 首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`...
JavaSE(Java基础) Java Core 关键字 synchronized关键字 Java String Java Arrays Java Collections Java 泛型 Java NIO Buffer Channel Selector Java 8 Features 源码解读 String源码系列 List源码系列 ArrayList ...
ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 ...Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb
* Java 集合框架提供了多种集合类,包括ArrayList、Vector、LinkedList、Stack、HashSet、TreeSet、LinkedHashSet、PriorityQueue等。 * Collection接口是所有集合类的父接口。 * Iterator接口用于遍历集合元素。 ...
HashSet 和 TreeSet 有什么区别? HashMap 和 TreeMap 有什么区别? 什么是迭代器?如何使用它来遍历集合? 什么是 fail-fast 机制? 如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator ...
Java的集合框架包括List(如ArrayList、LinkedList和Vector)、Set(如HashSet、TreeSet、LinkedHashSet和PriorityQueue)、Map(如HashMap、TreeMap、LinkedHashMap、Hashtable、IdentityHashMap、WeakHashMap)...
- 集合框架:如ArrayList、Vector、LinkedList、HashSet、TreeSet、LinkedHashSet、HashMap等,用于存储和操作对象。 - 泛型:提供类型安全,允许在类、接口和方法中指定参数类型。 - 反射:运行时动态获取类的...
### Java软件开发实战:Java基础与案例开发详解 #### 11-3 Set接口实现类 在Java集合框架中,`Set`接口是`Collection`接口的子接口,它不允许包含重复元素。本文将详细介绍`Set`接口及其三种主要实现类:`HashSet`...
4. Java集合框架:包括ArrayList、LinkedList、Vector、HashSet、TreeSet、LinkedHashSet、PriorityQueue等集合类。 Java集合框架提供了一些常用的集合类,可以用来存储和管理数据。这些集合类可以分为两种:List和...
Set接口代表不允许有重复元素的集合,如HashSet、TreeSet和LinkedHashSet。List接口则表示有序的、允许重复元素的集合,如ArrayList、LinkedList和Vector。Map接口则不同于Collection,它是键值对存储的接口,常见的...
Set 集合的实现类有 HashSet、LinkedHashSet 和 TreeSet 等。HashSet 是 Set 接口的典型实现,使用 Hash 算法来存储集合中的元素,具有很好的存取和查找性能。LinkedHashSet 是 HashSet 的子类,使用链表维护元素的...
Java 中的集合框架(Java Collections Framework)提供了多种集合类,包括 ArrayList、LinkedList、Vector、Stack、HashSet、TreeSet、LinkedHashSet 等。这些集合类可以用于存储和操作大量数据。 输入/输出 Java ...