首页 > 代码库 > hashMap,hashTable,hashSet,TreeMap的区别

hashMap,hashTable,hashSet,TreeMap的区别


【hashMap:】(键值对,不同步,无序)


存放的是key-value的值,采用put方法;可以存相同的对象。是map的子类;

并允许使用 null 值和 null 键(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)

此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 是无序的。

注意,此实现不是同步的。


【hashTable:】(对象,同步,无序)


为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。是无序的。

Hashtable 是同步的。


【TreeMap:】(键值对,不同步,有序)


构造一个新的、空的树映射,该映射根据给定比较器进行排序。是有顺序的。

注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。


【hashSet:】(不能存相同的对象,唯一,无序)


存放的是对象,采用add方法入参;不能存相同的对象;其底层也是存在hashMap中的key中,key是唯一的,所以hashSet也是唯一的。

value中存放的是一个常量。

注意,此实现不是同步的;此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它

不保证该顺序恒久不变。此类允许使用 null 元素。

public HashSet()构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。


【LinkedHashSet:】(唯一、有序、不同步)


具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行

于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。

注意,此实现不是同步的。


【理解HashSet及使用】


(1) 为啥要用HahSet?

假如我们现在想要在一大堆数据中查找X数据。LinkedList的数据结构就不说了,查找效率低的可怕。ArrayList哪,如果我们不知道X的位置序号,

还是一样要全部遍历一次直到查到结果,效率一样可怕。HashSet天生就是为了提高查找效率的(用contains方法)。

(2) hashCode 散列码

散列码是由对象导出的一个整数值。在Object中有一个hashCode方法来得到散列码。基本上,每一个对象都有一个默认的散列码,其值就是

对象的内存地址。但也有一些对象的散列码不同,比如String对象,它的散列码是对内容的计算结果:

hashSet总结:

1、HashSet不能重复存储equals相同的数据 。原因就是equals相同,数据的散列码也就相同(hashCode必须和equals兼容)。大量相

同的数据将存放在同一个散列单元所指向的链表中,造成严重的散列冲突,对查找效率是灾难性的。

2、HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。

3、hashCode必须和equals必须兼容, 这也是为了第1点。

import java.util.HashSet;   
		import java.util.Iterator;   
		  
		public class IteratorTest {   
			public static void main(String[] args) {   
				HashSet set = new HashSet();   
				set.add("a");   
				set.add("b");   
				set.add("c");   
				set.add("d");   
				set.add("e");   
				Iterator iter = set.iterator();   
				while(iter.hasNext()){   
					String value = (String)iter.next();   
					System.out.println(value);   
				}   
			}   
		}


本文出自 “JianBo” 博客,转载请与作者联系!

hashMap,hashTable,hashSet,TreeMap的区别