Map
1.HashMap作为Map的主要实现类,线程不安全,效率高,可以存储null的key和vaule
HashTable作为古老的实现类,线程安全,效率低,不能存储null的key和vaule
LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。
TreeMap:实现排序遍历。底层使用红黑树。
HashMap底层:数组加链表(jdk7以及之前)
数组+链表+红黑树(jdk8)
Properties:常用来处理配置文件,key和value都是String类型
2.Map结构的理解
Map中的key:无序的,不可重复的,使用Set存储所有的key
Map中的value:无序的,可以重复的,使用Collection存储所有的value
一个键值对:key-value构成了一个Entry对象。
Map中的Entry:无序的,不可重复的,使用Set存储所有的Entry。
3.HashMap底层原理
jdk7:在实例化以后,底层创建了长度是16的一维数组Entry[] table。 首先,调用key所在类的hashCode()计算key的hash值,此hash值经过某种算法计算以后,得到在Entry数组中的存放位置。
如果此位置上的数据为空,此时的key-value添加成功。
如果此位置上的数据不为空,(意味着此位置上存在着一个或多个数据(以链表形式存在)),比较key和已经存在的一个或多个数据的hash值:
如果key的hash值与已经存在的数据的hash值都不相同,此时key-value添加成功
如果key的hash值与已经存在的某一个数据的hash值相同,继续比较。调用key所在类的equals方法:
如果返回false,添加成功
如果返回true,替换value
在不断添加的过程中,会涉及到扩容问题,默认扩容为原来的2倍。
jdk8的不同
底层没有创建一个长度为16的Entry数组
jdk8底层的数组是Node[],而非Entry[]
首次调用put方法时,底层创建长度为16的数组
jdk7的底层数据结构只有:数组加链表,jdk8中底层结构数组+链表+红黑树
当数组的某一个索引位置上的元素以链表的形式存在的数据个数>8且当前数组的长度大于64时,此时索引位置上的所有数据改为使用红黑树存储。
4.HashMap中的重要常量
5.Properties
Properties类是Hashtable的子类,该对象用于处理属性文件。
存取数据时,建议使用setProperty(String key 和 String value)方法和getProperty(String key)方法。
6.Collections常用方法
和排序相关:
reaverse:反转List中元素的顺序
shuffle:对List集合中元素进行随机排序
swap:对List中i和j处的元素进行交换
和替换相关: