浅谈Collection的入门级知识点二:Map

Map部分
Map:public interface Map<k,v>{}
Map是映射接口,存储键值对(key-value),SoredMap排序的键值对,TreeMap有序的键值对,HashMap、Hashtable不保证次序的键值对,WeakHashmap的弱键值对
Map映射中不包含重复的键;每个键只能最多映射一个值;提供了“键-值对”、“根据键获取值”、“删除键”、“获取容量大小”等方法
Map提供接口分别用于返回键集、值集或键-值映射关系集
entrySet()返回键-值集的Set集合
keySet()返回键集的Set集合
values()返回值集的Collection集合
Map.Entry:键值对,Map通过entrySet()获取Map.Entry的键值对集合,从而进行操作
AbstraMap
SortedMap:自然排序与用户指定比较器,实现类提供的4个“标准”构造方法1.void无参构造方法2.带有一个Comparator类型参数的构造方法3.带有一个Map类型参数的构造方法4.带有一个SortedMap的构造方法
NavigableMap
Dictionary

HashMap:散列表、不同步、非线程安全、可null、无序
影响性能的两个参数:“初始容量”、“加载因子”,默认加载因子0.75;当哈希表中的条目数目超过了加载因子与当前容量的乘机时,需要对该哈希表进行rehash操作(重建内部结构),从而哈希表将具有大约两倍的桶数(容量)
HashMap通过“拉链法”实现哈希表及几个重要的成员变量:table (Entry[]数组,单向链表),size(键值对数量),threshold(阀值,判断是否需要调整容量),loadFactor(加载因子),modCount(实现fail-fast机制)
HashMap将“key为null”的元素都放在了table的位置0处
addEntry()一般用在新增Entry可能导致“HashMap的实际容量”超过”阀值“的情况下
creatEntry()一般用在新增Entry不会导致“HashMap的实际容量”超过”阀值“的情况下
HashMap串行写入函数”“writeObject()”:将HashMap的“总容量,实际容量,所有的Entry”都写入到输出流中
HashMap的串行读取函数“readObject()”:将HashMap的“总的容量,实际容量,所有的Entry”依次读出

Hashtable:散列表、键值对映射、继承与Dictionary、同步、线程安全、均不可为null、无序
影响性能的两个参数(与HashMap完全一样)影响性能的两个参数:“初始容量”、“加载因子”,默认加载因子0.75;当哈希表中的条目数目超过了加载因子与当前容量的乘机时,需要对该哈希表进行rehash操作(重建内部结构),从而哈希表将具有大约两倍的桶数(容量)
Hashtable通过“拉链法”实现哈希表及几个重要的成员变量:table (Entry[]数组,单向链表),size(键值对数量),threshold(阀值,判断是否需要调整容量),loadFactor(加载因子),modCount(实现fail-fast机制)
若Hashtable的实际大小为0,则返回“空枚举类”对象emptyEnumerator;否则返回正常的Enumerator的对象
Enumerator的作用:提供了“通过elements()遍历Hashtable的接口”和“通过entrySet()遍历Hashtable的接口”同步实现了“Enumerator接口”和“Iterator接口”
Hashtable串行写入函数”“writeObject()”:将HashMap的“总容量,实际容量,所有的Entry”都写入到输出流中
Hashtable的串行读取函数“readObject()”:将HashMap的“总的容量,实际容量,所有的Entry”依次读出

TreeMap:有序的key-value集合,通过红黑树实现,支持一系列导航方法,能被克隆,支持序列化,基于(Red-Black tree)实现、根据其键的自然顺序进行排序或者根据创建映射时提供的Comparator进行排序,非同步,其方法返回的迭代器是fail-fast的
包含几个重要的成员变量:root(红黑树的根节点Entry类型,包含了红黑树的6个基本组成成分:key(键)、value(值)、left(左孩子)、right(有孩子)、parent(父节点)、color(颜色))、size(节点个数)、comparator
通过传入参数SortedMap的有序构造函数,通过buildFromSorted()来创建对应的Map
buildFromSorted::通过递归将SortedMap中的元素逐个关联;返回middle节点(中间节点)作为root;添加到红红黑树中时,只将leve==redLevel的节点设为红色
那为什么外界不能直接调用 getFirstEntry(),而需要多此一举的调用 firstEntry() 呢?
现在我们清晰的了解到:
(01) firstEntry()是对外接口,而getFirstEntry()是内部接口。
(02) 对firstEntry()返回的Entry对象只能进行getKey()、getValue()等读取操作;而对getFirstEntry()返回的对象除了可以进行读取操作之后,还可以通过setValue()修改值。
TreeMap串行写入函数”“writeObject()”:将HashMap的“总容量,实际容量,所有的Entry”都写入到输出流中
TreeMap的串行读取函数“readObject()”:将HashMap的“总的容量,实际容量,所有的Entry”依次读出
关键字:transient
表示一个域不是该对象串行化的一部分,serialization提供一种持久化对象实例的机制,为了在一个特定对象的一个域上关闭serialization,可在这个域前加上关键字transient,当一个对象被串行化的时候,transient型变量的值不包括在串行化地表示中,然而非transient型的变量是被包括进去的
顺序遍历可通过keyIterator(0逆序遍历可通过descendingKeyIterator()

WeakHashMap:…

总结:
AbstractMap:减少了“Map实现类”的重复编码
SortedMap:有序
NavigableMap:继承于SortedMap,支持导航函数
HashMap:“拉链法”散列表,用于单线程
Hashtable:“拉链法”散列表,用于多线程
WeakHashMap:“拉链法”散列表,单线程,弱键
TreeMap:有序散列表,单线程

Hashmap、Hashtable异同
相同点:
HashMap和Hashtable都是存储“键值对(key-value)”的散列表,而且都是采用拉链法实现的。存储的思想都是:通过table数组存储,数组的每一个元素都是一个Entry;而一个Entry就是一个单向链表,Entry链表中的每一个节点就保存了key-value键值对数据。
添加key-value键值对:根据key值计算出哈希值,在计算出数组索引,然后,根据数组索引找到Entry,再遍历单项列表,将key和链表中的每一个节点的key进行对比。若key已经存在Entry链表中,则用该value值取代旧的value值;若key不存在Entry链表中,则新建一个key-value节点,并将该节点插入Entry链表的表头位置
删除key-value键值对:删除键值对,根据key计算出哈希值,再计算出素组索引,然后,根据索引找出Entry。若节点key-value存在与链表Entry中,则删除链表中的节点即可。
不同点:
1.继承和实现方式不同
HashMap继承于AbstractMap,实现了Map、Cloneable、Java.io.Serializable接口
Hashtable 继承于Dictionary,实现了Map、Cloneable\java.io.Serializable接口
2.线程安全不同
Hashtable同步的,线程安全的,支持多线程
HashMap非同步的,非线程安全
3.对null值的处理不同
HashMap的key、value都可以为null 会将null固定的插入table[0]位置;而且table[0]处只会容纳一个key为null的值,当有多个key为null的值插入的时候,table[0]会保留最后插入的value
Hashtable的key、value都不可为null 否则会抛出异常:NullPionterException
4.支持的遍历种类不同
HashMap只支持Iterator遍历
Hashtable支持Iterator和Enumeration两种方式遍历
5.通过Iterator遍历时,遍历顺序不同
HashMap是从前往后遍历数组,从表头开始遍历
Hashtable是从后往前遍历数组,从表头开始遍历
6.HashMap默认容量16,默认的加载因子0.75;增加容量时,每次将容量变为“原始容量x2”当HashMap的 “实际容量” >= “阈值”时,(阈值 = 总的容量 * 加载因子),就将HashMap的容量翻倍。;Hashtable默认容量11,默认的加载因子0.75;增加容量时,每次将容量变为“原始容量x2+1”
7.添加key-value时的hash值算法不同
HashMap添加元素时,是使用自定义的哈希值
Hashtable直接采用的key的hashCode()。
8.部分API不同
Hashtable支持contains(Object value)方法,而且重写了toString()方法;
而HashMap不支持contains(Object value)方法,没有重写toString()方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值