这里只介绍HashMap和TreeMap
Map集合是由键值对形式作为储存单元的。
LinkedHashMap,是由哈希表和链表实现的。(这里说明一下,仅仅哈希表就已经使用了数组和链表,jdk1.8就已改成数组加树)
这里介绍一个Map里面的方法,Set<Map.Entry<k,v>> entrySet(),该方法是因为Map里面定义了一个内部接口Entry,并在HashMap中实现了该内部类,该内部类就是键值对类型。
HashMap
数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法。默认初始容量16,加载因子0.75,扩容为旧容量乘2,查找元素快,如果key一样则比较value,如果value不一样,则按照链表结构存储value,就是一个key后面有多个value;
TreeMap
基于红黑二叉树的NavigableMap的实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口(跟TreeSet差不多),会按照排序后的顺序迭代元素,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出
HashTable和HashMap的区别:
HashMap:线程不安全,效率高,允许null键和null值
Hashtable:线程安全,效率低,不允许null值和null键