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中,而且键的类型是一个自定义的类,该类要覆写equals方法之外,还要覆写hashCode()方法,缘由是HashMap是根据键的哈希值来存放数据的。通常默认状况下,Object类的equals方法根据两个对象是否指向同一个地址而返回真假,hashCode根据不一样的对象为赋予不一样的整数值。 数据结构
除此以外,HashMap中键值对的顺序是乱序的,即放入的时候的顺序会被打乱,取出的时候多是乱序的。 多线程
Hashtable与HashMap基本上一致,使用方法和使用要求均一致,惟一的区别是Hashtable是线程安全的,而HashMap是线程不安全的。所以,若在多线程环境下,最好使用Hashtable来存放键值对,而单一线程下就使用HashMap存放键值对,由于HashMap的性能比Hashtable优化不少。 函数
LinkedHashMap其实是HashMap的一个子类,所以它继承自HashMap的许多特性和方法,然而,LinkedHashMap也有本身独特的地方,那就是它会按照键值对插入时的顺序取出来,即它是有序的。 性能
TreeMap的内部键值对的存储是有序的,而这个顺序是根据键的比较来肯定的,所以,若是想要把数据存进TreeMap但愿是按照键的大小来排序的,若是键是自定义类型的,键这个类型中必定要实现Comparable接口,进而要实现compareTo方法,否则存放数据时会抛出异常。 优化