Java集合类总结3——Map

来源:互联网 发布:空气质量检测仪 知乎 编辑:程序博客网 时间:2024/06/07 16:23

Map接口

Map提供keyvalue的映射。一个Map中不能包含相同的key,每个key只能映射一个valueMap接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

一、HashMap

1、定义:

publicclassHashMap<K,V>

    extends AbstractMap<K,V>    implements Map<K,V>, Cloneable, Serializable

2、构造函数

HashMap提供了三个构造函数:

HashMap():构造一个具有默认初始容量(16)和默认加载因子(0.75)的空HashMap

HashMap(intinitialCapacity):构造一个带指定初始容量和默认加载因子(0.75)的空HashMap

HashMap(intinitialCapacity, float loadFactor):构造一个带指定初始容量和加载因子的空HashMap

HashMap的实例有两个参数影响其性能:初始容量加载因子”。容量是哈希表中桶的数量,初始容量默认值为16。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash操作(即重建内部数据结构,新建一个更大尺寸的hash表,然后把数据从老的Hash表中迁移到新的Hash表中),从而哈希表将具有大约两倍的桶数。

对于使用链表法的散列表来说,查找一个元素的平均时间是O(1+a),因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。系统默认负载因子为0.75,一般情况下我们是无需修改的。

3、数据结构

Java中最常用的两种结构是数组和模拟指针(引用),几乎所有的数据结构都可以利用这两种来组合实现

HashMap底层实现还是数组,只是数组的每一项都是Entry节点。

staticclassEntry<K,V>implementsMap.Entry<K,V>{

        final K key;        V value;        Entry<K,V> next;        final int hash;        /**         * Creates new entry.         */        Entry(int h, K k, V v, Entry<K,V> n) {            value = v;            next = n;            key = k;            hash = h;        }        .......    }

EntryHashMap的内部类,它包含了键key、值value、下一个节点next,以及hash值,这是非常重要的,正是由于Entry才构成了table数组的单项链表。

2WeakHashMap
  WeakHashMap是一种改进的HashMap,它对key实行弱引用,如果一个key不再被外部所引用,那么该key可以被GC回收。

3Hashtable

Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者valueHashtable是同步的。HashMap是非同步的,并且允许null,即nullvaluenullkey,添加数据无序
  添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。
Hashtable通过initialcapacityloadfactor两个参数调整性能。通常缺省的loadfactor 0.75较好地实现了时间和空间的均衡。增大loadfactor可以节省空间但相应的查找时间将增大,这会影响像getput这样的操作。



原创粉丝点击