一、Map接口
内部包含映射键值对,其中,键不能重复,但是值可以
使用方法:
Map<key的数据类型,vaule的数据类型> map = new xxMap<>()
(因为Map是一个接口,不能具体是实现,因此只能用来接收)
当键相同时,后添加的键的值会覆盖前面的值,但是键不会改变
其具体实现类有以下几个:
HashMap、HashTable、LinkedHashMap、TreeMap
二、HashMap实现类
基于Hash表与Map接口实现,提供所有可选择的映射操作,并在内部允许存在null键与null值
使用方法:
Map<key的数据类型,vaule的数据类型> map = new HashMap<>()
特点:
1)内部采用哈希表(数组 + 链表 + 二叉树)结合存值,并在1.8以后引入红黑树(保证二叉树两两边的深度相同)
2)内部的存储顺序是无序的
3)默认加载因子为0.75(即实际存储空间为总的存储空间的0.75),长度大小默认为16
4)存储算法:把key对象通过hash()方法计算哈希值,然将计算出来的值对16取余得出的结果即为key存放的位置,当这个位置有多个对象时,采用链表进行存储,在1.8以后,链表长度大于8 时,采用红黑树存储
5)扩充算法为:原大小 <<1(即扩充两倍) 注:当等于加载因子大小就认为已经满了,需要扩充
6)线程不安全,适合单线程
三、HashTable
基于Hash表与Map接口实现,提供所有可选择的映射操作,并在内部允许存在null键与null值
注:在对象内部必须实现hashcode()方法与 equals()方法
使用方法:
Map<key的数据类型,vaule的数据类型> map = new HashTable<>()
特点:
1)内部采用哈希表(数组 + 链表 + 二叉树)结合存值,并在1.8以后引入红黑树(保证二叉树两两边的深度相同)
2)内部的存储顺序是无序的
3)默认加载因子为0.75(即实际存储空间为总的存储空间的0.75),长度大小默认为11
4)存储算法:与HashMap一致
5)扩充算法为:原大小 <<1(即扩充两倍) + 1 注:当等于加载因子大小就认为已经满了,需要扩充
6)线程安全,适合多线程操作
四、LinkedHashMap
是HashMap的子类,因此内部特点大概相同,但是LinkedHashMap内部结构是有序的,在其内部使用双重链表维持顺序
注:在对象内部必须实现hashcode()方法与 equals()方法
使用方法:
Map<key的数据类型,vaule的数据类型> map = new LinkedHashMap<>()
特点:
1)内部采用哈希表(数组 + 链表 + 二叉树)结合存值,并在1.8以后引入红黑树(保证二叉树两两边的深度相同)
2)内部的存储顺序是有序的
3)默认加载因子为0.75(即实际存储空间为总的存储空间的0.75),长度大小默认为16
4)存储算法:与HashMap一致
5)扩充算法为:原大小 <<1(即扩充两倍) + 1 注:当等于加载因子大小就认为已经满了,需要扩充
6)线程安全,适合多线程操作
五、TreeMap
内部基于红黑树的NavigableMap实现,内部进行自然排序,或者根据创建映射是提供的比较器进行排序,具体取决于使用的构造器
使用方法:
Map<key的数据类型,vaule的数据类型> map = new TreeMap<>()
六、Map接口新特性