Map
无序存储,存储的元素不能重复,如果相等,直接覆盖。
HashMap
- 数组+链表+红黑树结构,非线程安全
- HashMap存储值时不是按顺序来存,而是按照哈希值来存,取的时候同样是按照哈希值来取。HashMap也是不能存放相同的值,它是通过HashCode()和equals()来判断,如果HashMap中已存在相同的对象,则覆盖(这与HashSet不一致,HashSet遇到对象相等则不会存储)。
- 对象相等:如果两个引用指向同一个对象,那么这两个引用是相等的,他们的hashcode方法返回的值一致。如果没有重写Object中hashcode方法,返回的是对象在内存中的地址(值中带有‘@’)。所以必须要要重写hashCode()方法,才能使得两个对象都有相同的hashCode,并且还要重写equals()方法使得返回的值为true。满足这两个条件,那么证明两个对象在HashMap/HashSet中是相等的。
ConcurrentHashMap
数组+链表+红黑树结构,线程安全,是HashMap的线程安全版
HashTable
--extends Dictionary
线程安全的,方法上增加了Synchronied,不推荐使用
TreeMap
- 红黑树结构。容器中存放的元素有序(左小右大),且不重复。
- 有序:Set是无序的,那么TreeMap是通过什么来给元素排序的呢?第一种,使用默认的排序规则,即元素实现Comparable接口中的compareTo方法;第二种,使用容器自身的排序规则,初始化时传入一个Comparator,实现该接口的compare方法。 compare的优先级高于compareTo。
- 重复:如何来判断元素是否重复呢?也是通过compareTo或者comopare方法中的return 0 来判断。
LinkeHashMap
会保存插入的顺序, 在通过Iterator进行遍历的时候,先put的元素排在前面。
区分Map相关的集合貌似有点儿困难,记住这几条黄金法则即可
- 看到Concurrent的,就想到同步
- 看到tree,就想到两个接口:Comoparable、Comparator
- 看到linked,就想到插入顺序
- 看到hash,就想到hashCode、equals