Map集合
Collection集合的特点是每次进行单个对象的保存,如果现在要进行一对对象(偶对象)的保存就只能使用Map集合来 完成,即Map集合中会一次性保存两个对象,且这两个对象的关系:key=value结构。这种结构最大的特点是可以通 过key找到对应的value内容。
首先来观察Map接口定义:
public interface Map<K,V>
在Map接口中有如下常用方法:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1. | public V put(K key , V value); | 普通 | 向Map中追加数据 |
2. | public V get(Object key); | 普通 | 根据Key取得对应的Value,如果没有返回null |
3. | public Set KeySet(); | 普通 | 取得所有key信息,key不能重复 |
4. | public Collection values(); | 普通 | 取得所有value信息,可以重复 |
5. | public Set<Map.Entry<K,V>> entrySet(); | 普通 | 将Map集合变为Set集合 |
Map本身是一个接口,要使用Map需要通过子类进行对象实例化。Map接口的常用子类有如下四个: HashMap、 Hashtable、TreeMap、ConcurrentHashMap。
这篇博客重点讲解一下HashMap。
HashMap子类
用法如下:
Map<K,V> map = new HashMap<>();
这样就创建了一个Map集合,可以向里面用put方法添加K,V键值对。
先了解一下HashMap是如何存储键值对的,如图:
它结合了数组查找元素快,链表修改结构快的特点。先用哈希表建立一个数组,然后将产生哈希冲突的元素按照链地址法的方式放在桶里面的链表中。如果链表中的元素太多,链表还会树化,下面再详细说。
HashMap的构造方法
无参构造:
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
static final float DEFAULT_LOAD_FACTOR = 0.75f;
无参构造只是设置了一个哈希表的负载因子,用的是默认值的0.75。
有参构造:
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this