Map接口继承树:
Map接口概述:
- Map 与Collection并列存在。用于保存具有映射关系的数据:key-value。
- Map 中的 key 和 value 都可以是任何引用类型的数据。
- Map 中的 key 用 Set 来存放,不允许重复,即同一个Map 对象所对应的类,须重写 hashCode() 和 equals() 方法。
- 常用 String 类作为Map的 “键”。
- key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。
- Map 接口的常用实现类:HashMap、TreeMap、LinkedHashMap和Properties。其中,HashMap是Map接口使用频率最高的实现类。
Map的实现类的结构:
1 | |----Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x) |
Map结构的理解:
- Map中的key:无序的、不可重复的,使用Set存储所有的key —–> key所在的类要重写equals() 和 hashCode() 【以HashMap为例】。
- Map中的value:无序的、不可重复的,使用Collection存储所有的value —–> value所在的类要重写equals()。
- 一个键值对:key–value 构成了一个 Entry 对象。
- Map 中的entry:无序的、不可重复的,使用Set存储所有的entry。
HashMap的底层实现原理【以jdk7为例】
1 | HashMap map = new HashMap(); |
HashMap源码中的重要常量:
- DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,16
- MAXIMUM_CAPACITY : HashMap的最大支持容量,2^30
- DEFAULT_LOAD_FACTOR:HashMap的默认加载因子
- TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树
- UNTREEIFY_THRESHOLD:Bucket中红黑树存储的Node小于该默认值,转化为链表
- MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量。(当桶中Node的数量大到需要变红黑树时,若hash表容量小于MIN_TREEIFY_CAPACITY时,此时应执行resize扩容操作这个MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍。)
- table:存储元素的数组,总是2的n次幂
- entrySet:存储具体元素的集
- size:HashMap中存储的键值对的数量
- modCount:HashMap扩容和结构改变的次数。
- threshold:扩容的临界值,=容量*填充因子
- loadFactor:填充因子
LinkedHashMap:
- LinkedHashMap 是 HashMap 的子类。
- 在HashMap 存储结构的基础上,使用了一对双向链表来记录添加元素的顺序。
- 与LinkedHashSet 类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。
HashMap与LinkedHashMap的底层源码比较:
1 | --------------HashMap底层源码: |
Map常用方法:
1 | 添加、删除、修改操作: |
TreeMap:
- TreeMap存储 Key-value对时,需要根据 key-value对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态。
- TreeSet底层使用红黑树结构存储数据。
- TreeMap的key排序:
- 自然排序:TreeMap 的所有Key必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClassCastException。
- 定制排序:创建 TreeMap 时,传入一个Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 key 实现 Comparable 接口。
- TreeMap判断两个key相等的标准:两个key通过 commparTo() 方法或者compare() 方法返回0。
Demo:
1 | public class TreeMapTest { |
Hashtable:
- Hashtable 是个古老的 Map 实现类,JDK1.0就提供了。不同于HashMap,Hashtable是线程安全的。
- Hashtable 实现原理和 HashMap 相同,功能相同。底层都使用哈希表结构,查询速度快,很多情况下可以户用。
- 与HashMap不同,Hashtable 不允许使用 null 作为 key 和value。
- 与HashMap一样,Hashtable 也不能保证其中 key-value 对的顺序。
- Hashtable 判断两个key相等、两个value相等的标准,与HashMap一致。
Properties:
- Properties 类是 Hashtable 的子类,该对象用于处理属性文件。
- 由于属性文件里的 key、value 都是字符串类型,所以 Properties 里的 key 和 value 都是字符串类型。
- 存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法。
Demo
1 | Properties pros = new Properties(); |
Collections工具类:
Collections 是一个操作 Set、List 和 Map 等集合的工具类。
Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。
排序操作:(均为static方法)
reverse(List):反转 List 中元素的顺序
shuffle(List):对 List 集合元素进行随机排序
sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
Demo
1 | public class CollectionsTest { |