# Map集合
## Map的存储特点
1. 以键值对的形式存放
2. 键(key-K): 无序、无下标、元素不可重复
3. 值(value-V):无序、无下标、元素可以重复
## 常用实现类
1. HashMap
- JDK1.2 底层哈希表实现 线程不安全,效率高
2. LinkedHashMap
- JDK1.2 是HashMap的子类,底层哈希表实现 线程不安全,效率高
3. TreeMap
- JDK1.2 是SortedMap的实现类,底层红黑树实现 线程不安全,效率高
4. Hashtable
- JDK1.0 底层哈希表实现 线程安全,效率低
5. Properties
- JDK1.0 是Hashtable的子类,底层哈希表实现 线程安全,效率低
## 创建
建议使用多态
~~~java
Map<键的泛型,值的泛型> 集合名=new 实现类名<>();
~~~
## 常用方法
1. V put(K,V):往集合中添加一个键值对
- 如果键已经存在,则进行值的覆盖
2. int size():获取集合元素个数
3. boolean containsKey(K):判断是否包含指定键
4. boolean containsValue(V):判断是否包含指定值
5. V get(K):根据键获取值
6. V remove(K): 根据键删除整个键值对
## 遍历
1. 键遍历:获取所有的键,遍历键,根据键获取值
- Set<K的泛型> keySet():获取所有的键存入Set集合返回
Map<String, String> map = new HashMap<>();
map.put("username", "zhangsan");
map.put("tel", "13333333333");
map.put("pwd", "123456");
map.put("pwd", "789456");
System.out.println("键遍历:");
//先获取所有的键
Set<String> set1 = map.keySet();
//遍历Set
Iterator<String> it = set1.iterator();
while (it.hasNext()) {
//接收遍历的键
String key = it.next();
System.out.println(key+"-"+map.get(key));
}
2. 值遍历:获取所有的值,遍历值
- Collection<V的泛型> values():获取所有的值存入Collection集合返回
~~~java
//获取所有的值
Collection<String> coll = map.values();
//遍历所有的值
for (String s : coll) {
System.out.println(s);
}
~~~
3. 键值对遍历: 获取所有的键值对对象, 遍历键值对
- Set<Entry对象> entrySet(): 将集合键值对存入Entry对象,将所有Entry对象放入Set集合返回
- Entry对象的表现形式: `Map.Entry<K,V>`
- 获取键: `Entry对象.getKey()`
- 获取值:`Entry对象.getValue()`
~~~java
//获取所有的Entry对象
Set<Map.Entry<String, String>> set2 = map.entrySet();
//遍历所有entry对象
set2.forEach(entry->{
System.out.println(entry.getKey()+"-"+entry.getValue());
});
~~~
4. 自遍历forEach:
- forEach(BiConsumer接口实现类对象)
~~~java
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
System.out.println(key+"-"+value);
}
});
System.out.println("自遍历:(lambda)");
map.forEach((k,v)-> System.out.println(k+"-"+v));
~~~
## 使用
1. 当哈希表的键为自定义类型时,必须重写类的hashCode和equals才能实现去重
2. HashMap允许null值和null键
- 最多存在一个null键,可以存在多个null值
3. LinkedHashMap在HashMap的基础上可以保证元素存入和取出的顺序一致
4. TreeMap可以根据键对元素进行默认的升序排序
- 如果键为自定义类型,则必须书写排序规则,方式与TreeSet一致
- 无法对null值进行排序(键不可为null)
5. Hashtable不允许null值和null键
6. Properties只能存放String类型
- 不推荐使用多态
- 不可添加泛型
- 推荐优先使用独有内容
- String V getProperty(String K): 根据键获取值
- setProperty(String k,String v):添加键值对
- load(输入流): 根据流将配置文件内容读取到集合中
## 掌握
1. map的存储特点
2. Map的常用实现类和特点
3. Map的创建语法
4. Map的遍历方式
5. Map的使用