在上一篇集合框架中Map讲的不是很详细,在实际开发中,Map的作用还是很大的,所以再来理一理。
Map存储的是键值对(key : value),一个key对应一个value,不允许有重复的key,当你试图添加一个相同的key的时候,这个key的value会覆盖之前的value。Map是通过hashCode
判断和.equals
方法来判断一个key是否相同的,也就是说,当你put一个新项到Map中,它会先遍历这个Map,将每个key和你新put的key进行对比,如果hashCode不相等,那么.equals
方法返回肯定为false,所以可以将这个项put进去;如果hashCode相同,但是.equals
方法的返回值也不一定为true,也就是还要判断.equals
方法,如果为true,Map就会认为这个key已经存在了,会覆盖这个key之前的value。所以如果你想在Map中存放一个自定义的对象,那么这个对象必须要重写hashCode
和equals
方法。
Map常用方法
-
size() : int
返回Map中元素的个数 -
isEmpty() : boolean
返回一个布尔值,表示这个Map是否为空 -
containsKey(Object) : boolean
返回一个布尔值,表示这个Map中是否存在一个为Object的key -
containsValue(Object) : boolean
返回一个布尔值,表示这个Map中是否存在一个为Object的value -
get(Object) : V
返回Object这个key所对应的Value -
put(K, V)
添加一个元素到Map中 -
clear()
清除Map中的元素 -
keySet() : Set
返回一个Set对象,里面包含Map的所有key -
values() : Collection
返回一个实现了Collection的类的对象,里面包含Map中的所有value -
entrySet() : Set
返回一个Set,Set中的每个元素都为entry,每个entry中包含Map的一个Key和对应的Value -
equals() : boolean
用于比较两个Map是否相等
三个常用实现类
HashMap
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口,HashMap是无序的
LinkedHashMap
继承于HashMap,与HashMap不同的是:LinkedHashMap可以记录你添加元素的顺序,因此它是有序的
TreeMap
继承于AbstractMap,类似于TreeSet,TreeMap也会对元素按照自然顺序排序,默认升序。