文章目录
Map 接口
public interface Map<K, V>
Collection 集合的特点是每次进行单个对象的保存, 那么如果现在要进行一对对象的保存(偶对象), 就只能是使用 Map 集合的完成, 所以Map 集合中会一次性的保存两个, 两个对象的关系 : key -> value 的结构, 那么这种结构最大的特点是可以通过key找到对应的value 内容.
Map 接口里面的常用方法
方法名称 | 类型 | 描述 | |
---|---|---|---|
1 | public V put(K key, V value) |
普通 | 向集合中追加数据 |
2 | public V get(Object key) |
普通 | 根据 key 取得对应的 value, 如果没有 返回 null |
3 | public Set<`K> keySet() | 普通 | 取得所有 key 的信息, 返回set 类型, 则表示不能重复 |
4 | public Collection<`V> values() | 普通 | 取得所有 value 的信息, 返回Collection 类型, 则表示不关注重复与否 |
5 | public Set<Map.Entry<K,V>> entrySet() |
普通 | 将Map集合变为Set集合 |
Map 本身是一个接口, 要使用Map必须使用子类进行对象的实例化, 而子类有如下几个常用的:
- HashMap
- Hashtable
- TreeMap : 用于排序
- ConcurrentHashMap
HashMap 子类 (90%) (无序)
HashMap 是在使用Map 集合中最为常用的子类了, 下面先通过观察Map的使用操作:
范例: Map 基本处理
package com.beyond.nothing;
import java.util.*;
public class test {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer, String>();
map.put(1, "Hello");
map.put(1, "World"); // key 重复
map.put(2, "World2");
System.out.println(map);
System.out.println(map.get(1)); // 根据 key 取得数据
// System.out.println(map.get(99)); // null
//取得Map中所有key的值和value的值, 这种输出操作只是一种娱乐, 实际并不会使用
Set<Integer> set = map.keySet(); // 取得所有的Key信息
Iterator<Integer> iter = set.iterator();
while (iter.hasNext()){
Integer key = iter.next();
System.out.println(key +"= "+map.get(key));
}
}
}
此种输出操作没有任何的实际意义, 只是为了对其做一个功能使用的说明, 因为这样的输出操作复杂度太高: N*N 的复杂度
面试题: 请解释 HashMap 原理
在数据量小的时候, HashMap 是按照链表模式存储的. 当数据量变大之后, 为了进行我们快速的查找, 那么我们会将这个链表变为红黑树(均衡二叉树), 用 hash 码作为数据的定位, 来进行保存.
Hashtable 子类 (1%)
JDK 1.0 提供有三大主要类: Vector, Enumeration, Hashtable.
Hashtable 是最早实现这种元偶对象数据结构, 后期设计的时候也让其于 Vector 类一样多实现了 Map 接口而已.
范例: 观察 Hashtable (无序)
package com.beyond.nothing;
import java.util.*;
public class test {
public static void main(String[] args) {
Map<Integer,String> map = new Hashtable<>();
map.put(1, "Hello");
map.put(1, "World"); // key 重复
map.put(2, "World2");
System.out.println(map);
System.out.println(map.get(1)); // 根据 key 取得数据
//取得Map中所有key的值, 这种输出操作只是一种娱乐, 实际并不会使用
Set<Integer> set = map.keySet(); // 取得所有的Key信息
Iterator<Integer> iter = set.iterator();
while (iter.hasNext()){
Integer key = iter.next();
System.out.println(key +"= "+map.get(key));
}
}
}
HashMap 与 Hashtable 区别
- Hashtable 不允许值为空 (NPE)
- HashMap 可以设置
面试题: 请解释 HashMap 与 Hashtable 的区别
区别 | HashMap | Hashtable |
---|---|---|
推出版本 | JDK 1.2 | JDK 1.0 |
性能 | 异步处理, 性能高 | 同步处理处理, 性能相对较低 |
安全性 | 非线程安全 | 线程安全 |
存放 null | 允许存储null | Key 和 Value 都不允许为 null, 否则出现 NullPointerException |
以后使用的时候多使用 HashMap