Map
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和一个值对象Value,键和值对象之间存在一种对应关系,称为映射。一个映射不能包含重复的键,每个键最多只能映射到一个值。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value。
Set底层依赖的是Map
1.V put(K key,V value):添加元素。如果键是第一次存储,就直接存储元素,返回null。如果键不是第一次存储,就用值把以前的值替换掉,返回以前的值。
2.void clear():移除所有键值对元素
3.V remove(Object key):根据键删除键值对元素,并把值返回
4.boolean containsKey(Object key):判断集合是否包含指定的键
5.boolean containsValue(Object Value):判断集合是否包含指定的值
6.boolean isEmpty():判断集合是否为空
7.Set<Map.Entry<E,V>> entrySet()
:返回此映射中包含的映射关系的Set视图
8.V get(Object key):根据键获取值
9.Set<K> keySet()
:获取集合中所有键的集合
10.Collection<V> values()
:获取集合中所有值的集合
11.int size():返回集合中键值对的个数
遍历
第一种方式就是先遍历Map集合中所有的键,再根据键获取相应的值。
package com.first;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HelloWorld {
public static void main(String[] args) {
Map<String, Integer> map=new HashMap<>();
map.put("张三", 23);
map.put("李四", 24);
map.put("王五", 25);
map.put("赵六", 26);
Set<String> keySet=map.keySet();
Iterator<String> it=keySet.iterator();
while (it.hasNext()) {
String key = (String) it.next();
Integer value=map.get(key);
System.out.println(key+"="+value);
}
}
}
运行结果为
赵六=26
张三=23
李四=24
王五=25
用增强for循环可简写为
for(String key:map.keySet()){
System.out.println(key+"="+map.get(key));
}
第二种方式是先获取集合中的所有映射关系,然后从映射关系中取出键和值。
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> it = entrySet.iterator();
while (it.hasNext()) {
// 获取每一个Entry对象
Map.Entry<String, Integer> en = it.next(); // 父类引用指向子类对象
// Entry<String, Integer> en = it.next(); //直接获取的是子类对象
String key = en.getKey(); // 根据键值对对象获取键
Integer value = en.getValue(); // 根据键值对对象获取值
System.out.println(key + "=" + value);
}
首先调用Map对象的entrySet方法获得存储在Map中所有映射的Set集合,这个集合中存放了Map.Entry类型的元素(Entry是Map接口内部类),每个Map.Entry对象代表Map中的一个键值对,然后迭代Set集合,获得每一个映射对象,并分别调用映射对象的getKey和getValue方法获取键和值。
用增强for循环可简写为
for(Entry<String, Integer> en : map.entrySet()) {
System.out.println(en.getKey() + "=" + en.getValue());
}
第二种方法的效率更高。
HashMap和Hashtable
共同点:底层是哈希算法,都是双列集合
区别:
- Hashtable是线程安全的,效率低(目前基本被HashMap所取代),JDK1.0版本。HashMap线程不安全,效率高,JDK1.2版本
- Hashtable不可以存储null键和null值。HashMap可以存储null键和null值。
LinkedHashMap
HashMap集合迭代出来元素的顺序和存入的顺序是不一致的。如果想让这两个顺序一致,可以使用LinkedHashMap类,和LinkedList一样也使用双向链表来维护内部元素的关系,使Map元素迭代的顺序和存入的顺序一致。
Properties
- String getProperty(String key)
- String getProperty(String key,String defaultValue)
- void load(Reader reader):按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
Properties主要用来存储字符串类型的键和值,在实际开发中使用Properties集合来存取应用的配置项。
TreeMap
TreeMap通过二叉树的原理来保证键的唯一性,与TreeSet集合存储的原理一样,TreeMap中所有键是按照某种顺序排列的。