Map:是一个接口,其定义的集合又称查找表,用于存储“key-value”映射对。key可以看成是value的索引。
作为key的对象在集合中不能重复,即:在一个Map中不能有2个equals()比较结果为true的key。
Map集合看起来像一个多行2列的表格,常用的2个实现类为:hash表(HashMap)和二叉树表(TreeMap)
LinkedHashMap:维护着一个双向循环链表,通常迭代顺序为存放顺序。可实现有序Map。
int size():获取“key-value”对的个数,而不是元素总个数
Mapzhong中String tostring()的返回形式为:{key1 = value1,key2 = value2,...}
V put(K key,V value):向Map中存放元素
若key在Map中不存在,会将给定的key与value存入Map中,返回值为null
若key在Map中存在,添加新的value,则是替换原有的value,返回被替换的value
这里我们应该注意:若value是一个包装类,我们获取put返回值时,应当使用相对应的包装类去接收value,而不应该使用基本类型。因为会涉及到隐式的自动拆箱,可能引发空指针异常。
V get(K key):获取Map中给定的key对应的value并返回,若key在Map中不存在则返回null
V remove(K key):根据给定的key删除“key-value”对元素,并返回key所对应的value。若key不存在则返回null。
boolean containsKey(K key):查看当前Map中是否包含给定的key
Map提供了三种遍历方式:
(1)遍历所有的key
Set<K> keySet():将当前Map中所有的key存入一个Set集合中,并返回集合。我们只需遍历该集合即可。
(2)遍历每一个键值对
Set< Entry<K><V> > entrySet()
将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合中,并返回。
该方法获取一个Set集合,该集合中存放若干个Entry实例,每个实例内部都包含两个属性,分别保存key、value。
这样我们遍历每一个Entry实例就相当于遍历了每一个键值对。
(3)遍历所有的value(不常用)
Collection values():将所有的value放入一个集合中,并返回。
不能放入Set集合,因为value允许重复。
使用HashMap的注意事项:
(1)我们应当尽量保证不相同的key,hashCode值也不应该相同,否则将大大降低hashCode()的检索效果
(2)若两个对象equals()结果为true,那么两个对象的hashCode值也一定相等。
(3)若两个对象equals()结果为false,我们也应尽量保证它们的hashCode值不相同
(4)当key-value的属性没有改变的情况下,hsahCode的值应当是一个稳定值
(5)一般我们在重写equals()也必须重写hashCode()
装载因子及HashMap的优化:
Capacity:容量,即散列数组的大小
Initial capacity:初始容量,默认为16
Size:当前散列表中存储数据的对数
Load factor:加载因子,Size/capacity的值,默认为0.75,用于判断是否扩容和rehash。可减少资源浪费,和提高性能。