标签:
1.Map接口
Map接口定义的集合又称查找表,用于存储所谓"Key-Value"映射对。
Key可以看成是Value的索引,作为Key的对象在集合中不可以重复。
根据内部数据结构的不同,Map接口有多种实现类,
其中常用的有内部为hash表实现的HashMap和内部为排序 二叉树实现的TreeMap。
2.put()方法
Map接口中定义了向Map中存放元素的put方法:
V put(K key,V value)
将Key-Value对存入Map,如果在集合中已经包含该Key,则操作将替换该Key所对应的Value,
返回值为该Key原来所对应的Value(如果没有则返回null)。
3.get()方法
Map接口中定义了从Map中获取元素的get方法:
V get(Object key)
返回参数key所对应的Value对象,如果不存在则返回null.
4.containsKey()方法
Map接口中定义了判断某个key是否在Map中存在:
boolean containsKey(Object key);
若Map中包含给定的key则返回true,否则返回false。
5.Hash表的原理 (如图)
6.hashCode方法
从HashMap的原理中我们可以看到,key的hashCode()方法的返回值对HashMap存储元素时会起着很重要的作用。
而hashCode()方法实际上是在Object中定义的。那么应当妥善重写该方法:
对于重写了equals方法的对象,一般要妥善的重写继承自Object类的hashCode()方法
(Object提供的hashCode方法将返回该对象所在内存地址的整数形式).
重写hashCode方法是需要注意两点:
其一、与equals方法的一致性,即equals比较返回true的两个对象其hashCode方法返回值应该相同;
其二、hashCode返回的数值符合hash算法的要求,
试想如果有很多对象的hashCode方法返回值都相同,则会大大降低hash表的效率,
一般情况下可以使用IDE(如Eclipse)提供的工具自动生成hashCode方法。
7.装载因子及HashMap优化
Capacity:容量,hash表里bucket(桶)的数量,也就是散列数组大小。
Initial capacity:初始容量,创建hash表时,初始bucket的数量,默认构建容量是16,也可以使用特定容量。
Size:大小,当前散列表中存储数据的数量。
Load factor:加载因子,默认值0.75(就是75%),当向散列表增加数据时如果size/capacity的值大于Load factor则发生扩容并且重新散列(rehash)。
性能优化:加载因子较小时,散列查找性能会提高,同时也浪费了散列桶空间容量。
0.75是性能和空间相对平衡结果。在创建散列表时指定合理容量,减少rehash提高性能。
8.使用Keyset()方法
Map提供了三种遍历方式:
遍历所有的Key
遍历所有的Key-Value对
遍历所有的Value(不常用)
遍历所有Key的方法
Set<K> keySet()
该方法会将当前Map中所有的key存入一个Set集合后返回。
9.使用entryset()方法
遍历所有的键值对的方法:
Set<Entry<K,V>> entrySet()
该方法会将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合后返回。
10.LinkedHashMap实现有序Map
使用Map接口的哈希表和链表实现,具有可预知的迭代顺序。此实现与HashMap的不同之处在于:
LinkedHashMap维护着一个双向循环链表。此链表定义了迭代顺序,该迭代顺序通常就是存放元素的顺序。
需要注意的是,如果在Map中重新存入已有的key,那么key的位置不会发生改变,只是将value值替换。
标签:
原文地址:http://www.cnblogs.com/Crow0/p/5202192.html