`

【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);
	}
	
}

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    HashSet,TreeSet和LinkedHashSet的区别1

    本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序 5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新...

    day18-集合-中(HashSet&TreeSet&比较器).zip

    在Java编程语言中,集合框架是处理对象组的重要工具,其中`HashSet`和`TreeSet`是两种常见的接口实现类,分别提供了不同的功能和性能特性。本教程将深入探讨这两个集合类以及它们与比较器(Comparator)的关系。 ...

    Java 基础核心总结 +经典算法大全.rar

    AbstractSet 抽象类SortedSet 接口HashSet LinkedHashSet TreeSet List 接口 AbstractList 和 AbstractSequentialList Vector Stack ArrayList LinkedList Queue接口Deque 接口 AbstractQueue 抽象类LinkedList ...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...

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

    本文将深入探讨Java中四个主要的Set实现类:HashSet、LinkedHashSet、TreeSet以及EnumSet。 首先,Set集合的核心特性是不存储重复元素。在尝试通过`add()`方法添加相同元素时,如果集合中已经存在该元素,`add()`...

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    JavaSE(Java基础) Java Core 关键字 synchronized关键字 Java String Java Arrays Java Collections Java 泛型 Java NIO Buffer Channel Selector Java 8 Features 源码解读 String源码系列 List源码系列 ArrayList ...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 ...Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb

    Java 基础核心总结.pdf

    * Java 集合框架提供了多种集合类,包括ArrayList、Vector、LinkedList、Stack、HashSet、TreeSet、LinkedHashSet、PriorityQueue等。 * Collection接口是所有集合类的父接口。 * Iterator接口用于遍历集合元素。 ...

    Java 集合方面的面试题

    HashSet 和 TreeSet 有什么区别? HashMap 和 TreeMap 有什么区别? 什么是迭代器?如何使用它来遍历集合? 什么是 fail-fast 机制? 如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator ...

    Java基础核心总结.PDF

    Java的集合框架包括List(如ArrayList、LinkedList和Vector)、Set(如HashSet、TreeSet、LinkedHashSet和PriorityQueue)、Map(如HashMap、TreeMap、LinkedHashMap、Hashtable、IdentityHashMap、WeakHashMap)...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    - 集合框架:如ArrayList、Vector、LinkedList、HashSet、TreeSet、LinkedHashSet、HashMap等,用于存储和操作对象。 - 泛型:提供类型安全,允许在类、接口和方法中指定参数类型。 - 反射:运行时动态获取类的...

    Java软件开发实战 Java基础与案例开发详解 11-3 Set接口实现类 共19页.pdf

    ### Java软件开发实战:Java基础与案例开发详解 #### 11-3 Set接口实现类 在Java集合框架中,`Set`接口是`Collection`接口的子接口,它不允许包含重复元素。本文将详细介绍`Set`接口及其三种主要实现类:`HashSet`...

    Java基础核心总结.pdf

    4. Java集合框架:包括ArrayList、LinkedList、Vector、HashSet、TreeSet、LinkedHashSet、PriorityQueue等集合类。 Java集合框架提供了一些常用的集合类,可以用来存储和管理数据。这些集合类可以分为两种:List和...

    Java集合面试题汇总.pdf

    Set接口代表不允许有重复元素的集合,如HashSet、TreeSet和LinkedHashSet。List接口则表示有序的、允许重复元素的集合,如ArrayList、LinkedList和Vector。Map接口则不同于Collection,它是键值对存储的接口,常见的...

    大学课程讲义-Java基础-Java集合.pptx

    Set 集合的实现类有 HashSet、LinkedHashSet 和 TreeSet 等。HashSet 是 Set 接口的典型实现,使用 Hash 算法来存储集合中的元素,具有很好的存取和查找性能。LinkedHashSet 是 HashSet 的子类,使用链表维护元素的...

    Java面试必看基础知识

    Java 中的集合框架(Java Collections Framework)提供了多种集合类,包括 ArrayList、LinkedList、Vector、Stack、HashSet、TreeSet、LinkedHashSet 等。这些集合类可以用于存储和操作大量数据。 输入/输出 Java ...

Global site tag (gtag.js) - Google Analytics