Map接口
Map与List、Set接口不同,
它是由一系列键值对组成的集合,提供了key到Value的映射。
同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。
HashMap
以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,
它是为快速查询而设计的,
其内部定义了一个hash表数组(Entry[] table),
元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,
如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,
可能通过查看HashMap.Entry的源码它是一个单链表结构。
LinkedHashMap
LinkedHashMap是HashMap的一个子类,它保留插入的顺序,
如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。
LinkedHashMap是Map接口的哈希表和链接列表实现,
具有可预知的迭代顺序。此实现提供所有可选的映射操作,
并允许使用null值和null键。此类不保证映射的顺序,
特别是它不保证该顺序恒久不变。
LinkedHashMap实现与HashMap的不同之处在于,
后者维护着一个运行于所有条目的双重链接列表。
此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
根据链表中元素的顺序可以分为:
按插入顺序的链表,和按访问顺序(调用get方法)的链表。
默认是按插入顺序排序,如果指定按访问顺序排序,
那么调用get方法后,会将这次访问的元素移至链表尾部,
不断访问可以形成按访问顺序排序的链表。
注意,此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。由于LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代访问Map里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。
TreeMap
TreeMap 是一个有序的key-value集合,非同步,基于红黑树(Red-Black tree)实现,每一个key-value节点作为红黑树的一个节点。
TreeMap存储时会进行排序的,会根据key来对key-value键值对进行排序,其中排序方式也是分为两种,一种是自然排序,一种是定制排序,具体取决于使用的构造方法。
自然排序:TreeMap中所有的key必须实现Comparable接口,并且所有的key都应该是同一个类的对象,否则会报ClassCastException异常。
定制排序:定义TreeMap时,创建一个comparator对象,该对象对所有的treeMap中所有的key值进行排序,采用定制排序的时候不需要TreeMap中所有的key必须实现Comparable接口。
TreeMap判断两个元素相等的标准:
两个key通过compareTo()方法返回0,则认为这两个key相等。
如果使用自定义的类来作为TreeMap中的key值,
且想让TreeMap能够良好的工作,则必须重写自定义类中的equals()方法,TreeMap中判断相等的标准是:
两个key通过equals()方法返回为true,并且通过compareTo()方法比较应该返回为0。