Map接口是Java中保存二元偶对象,也就是键值对(key-value)的最顶层接口。
1.Map接口的核心方法:
- public V put(K key,V value):向Map中添加数据
- public V get(K key):根据指定的key值取得相应的value值,若没有key值,返回null
- public Set<Map.Entry<K,V>> entrySet():将Map集合变为Set集合
- public Set keySet():返回所有key值集合,key不能重复
- public Collection values():返回所有value值,value可以重复
2.Map集合的遍历:
Map集合不可以直接使用迭代器遍历输出,而是要先变为Set集合再遍历输出,如下:
public static void main(String[] args) {
Map<Integer,String> hashMap = new HashMap<>();
hashMap.put(1,"1");
hashMap.put(5,"2");
hashMap.put(3,"3");
hashMap.put(null,"1");
hashMap.put(null,null);
Set<Map.Entry<Integer,String>> set = hashMap.entrySet();
Iterator<Map.Entry<Integer,String>> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
结果如下:
默认采用key=value的格式输出集合,若想要输出key值或value值,可以使用getKey()与getValue()。
3.Map接口下的三大常用子类:
- HashMap:
public static void main(String[] args) {
Map<Integer,String> hashMap = new HashMap<>();
hashMap.put(1,"1");
hashMap.put(5,"2");
hashMap.put(3,"3");
hashMap.put(null,null);
hashMap.put(null,"5");
Set<Map.Entry<Integer,String>> set = hashMap.entrySet();
Iterator<Map.Entry<Integer,String>> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
结果如下:
-
TreeMap:
若将上述代码改为TreeMap,会有NullPointerException异常,说明key值不能为空。
我们插入这几条数据看一下结果:
可见,TreeMap实现了有序存储。 -
HashTable:
将上部分代码改为Hashtable,发现也会有空指针异常,此时的key和value都不能为空,故我们只插入前三条数据即可,结果如下:
4.HashMap、TreeMap、Hashtable的区别与联系:
- HashMap、TreeMap、Hashtable都是Map接口的常用子类。
- HashMap出现于JDK1.2,基于哈希表+红黑树实现;
TreeMap出现于JDK1.2,基于红黑树实现;
Hashtable出现于JDK1.0,基于哈希表实现。 - HashMap采用懒加载策略,初始化哈希表为16,但其实真正容量是12;采用异步处理,线程不安全,效率较高;
TreeMap采用异步处理,线程不安全,效率较高
Hashtable产生对象时初始化内部哈希表为16,采用方法上synchronized加锁,线程安全,性能很低。 - HashMap允许key值与value值为空;
TreeMap允许value值为空;
Hashtable的key与value都不能为空。
5.判断两个对象是否相等:
Object类提供的hashCode()其实是为了获取对象的哈希值,用于确定该对象在哈希表中的索引位置。
若两个对象的equals()返回true,那么他们的hashCode()一定会返回true;
若两个对象的hashCode()返回true,他们的equals()不一定会返回true。
所以,当且仅当equals()与hashCode()都返回true时,认为两个对象真正相等。