详解HashMap,Hashtable,LinkedHashMap,TreeMap的异同点

Map

Map是是一种数据结构,它是把数据按照key-value键值对的形式保存起来,一般来说,Map的定义是key是独一无二的,即存在map中的各个键一定是不能相同的。当然,对于一般的基本数据类型和String类型,对象都是可以自动比较的,建议键一般用不可变(immutable,可以参考我的另外一篇博文———不可变设计模式)类型。而对于其它的复杂类型,如果你没有在类中定义equals方法,则map中是可以存放相同的键的,因为它无法判断两个对象是否相同,所以在使用map存储数据时,键的数据类型一定要覆写equals方法,以提供可以判断两个对象是否相等的方法。

Map并不是Collection的一部分,即它是一个独立的接口,并没有继承Collection接口,因此它无法直接实现迭代器。但是它可以通过调用方法entrySet得到一个Set对象,而Set是Collection的一个类,因此Set可以生成迭代器。另外,Map内部还有一个EntrySet<K,V>接口,这个接口可以提供获取键-值的方法,非常方便。

HashMap

HashMap内部是通过一个哈希函数来计算键的哈希值,然后内部含有一个数据结构用来存放键的哈希值,进而可以根据它的哈希值来检索键值对的位置。因此,如果你要将数据存进HashMap中,并且键的类型是一个自定义的类,该类要覆写equals方法以外,还要覆写hashCode()方法,原因是HashMap是根据键的哈希值来存放数据的。一般默认情况下,Object类的equals方法根据两个对象是否指向同一个地址而返回真假,hashCode根据不同的对象为赋予不同的整数值。

除此之外,HashMap中键值对的顺序是乱序的,即放入的时候的顺序会被打乱,取出的时候可能是乱序的。

Hashtable

Hashtable与HashMap基本上一致,使用方法和使用要求均一致,唯一的区别是Hashtable是线程安全的,而HashMap是线程不安全的。因此,若在多线程环境下,最好使用Hashtable来存放键值对,而单一线程下就使用HashMap存放键值对,因为HashMap的性能比Hashtable优化很多。

LinkedHashMap

LinkedHashMap实际上是HashMap的一个子类,因此它继承自HashMap的许多特性和方法,然而,LinkedHashMap也有自己独特的地方,那就是它会按照键值对插入时的顺序取出来,即它是有序的。

TreeMap

TreeMap的内部键值对的存储是有序的,而这个顺序是根据键的比较来确定的,因此,如果想要把数据存进TreeMap希望是按照键的大小来排序的,如果键是自定义类型的,键这个类型中一定要实现Comparable接口,进而要实现compareTo方法,不然存放数据时会抛出异常。


你可能感兴趣的:(java,数据结构,map,键值对)