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点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);   
                 }   
             }   
         }




      本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/1899745,如需转载请自行联系原作者




相关文章
|
5月前
|
安全 Java
HashMap和Hashtable的区别
HashMap和Hashtable的区别
34 2
|
3月前
|
安全 算法
HashMap和Hashtable 的区别
HashMap和Hashtable 的区别
19 0
|
4月前
|
存储 安全 Java
HashMap和HashTable的区别
HashMap和HashTable的区别
23 0
|
8月前
|
存储 算法 安全
HashMap,TreeMap,Hashtable,LinkedHashMap的区别
HashMap,TreeMap,Hashtable,LinkedHashMap的区别
51 0
|
9月前
|
安全
HashMap 和 HashTable 的区别
HashMap 和 HashTable 的区别
87 0
|
11月前
|
存储 安全
HashSet和HashMap
HashSet和HashMap
84 0
|
安全
3. 如何决定使用 HashMap 还是 TreeMap?
3. 如何决定使用 HashMap 还是 TreeMap?
85 0
|
存储 安全
HashTable 与HashMap区别
HashTable 与HashMap区别
81 0
|
存储 安全 算法
HashMap和Hashtable的联系与区别
HashMap和Hashtable的联系与区别
137 0
HashMap和Hashtable的联系与区别
|
安全 Java
HashMap与HashTable的区别
HashMap与HashTable的区别
89 0