Map 集合没有继承 Collection 接口,其提供的是 key 到 value 的映射,Map 中不能包含相同的 key 值,每个 key 只能影射一个 value。key 值还决定了存储对象在映射中的存储位置,但不是 key 对象本身决定的,而是通过散列技术进行处理,可产生一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。
1.1 Map 接口
Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 key,另外一组值用于保存 Map 里的 value,key 和 value 都可以是任何引用类型的数据。Map 的 key 不允许重复,即同一个 Map 对象的任何两个 key 通过 equals 方法比较总是返回false。
key 和 value 之间存在单向一对一关系,即通过指定的 key,总能找到唯一的、确定的 value。从 Map 中取出数据时,只要给出指定的 key,就可以取出对应的 value 数据。
1.1.1 常用方法
方法名 | 说明 |
---|---|
void clear( ) | 删除该 Map 对象中的所有 key-value 对 |
boolean containsKey(Object key) | 查询 Map 中是否包含指定的 key,如果包含则返回 true |
boolean containsValue(Object value) | 查询 Map 中是否包含一个或多个 value,如果包含则返回 true。 |
Set entrySet( ) | 返回 Map 中包含的 key-value 对所组成的 Set 集合,每个集合元素都是 Map.Entry(Entry 是 Map 的内部类)对象 |
Object get(Object key) | 返回指定 key 所对应的 value;如果此 Map 中不包含该 key,则返回 null |
boolean isEmpty( ) | 查询该 Map 是否为空(即不包含任何 key-value 对),如果为空则返回 true |
Set keySet( ) | 返回该 Map 中所有 key 组成的 Set 集合 |
void put(Object key,Object value) | 添加一个 key-value 对,如果当前 Map 中已有一个与该 key 相等的 key-value 对,则新的 key-value 对会覆盖原来的 key-value 对 |
void putAll(Map map) | 将指定 Map 中的 key-value 对复制到本 Map 中 |
Object remove(Object key) | 删除指定 key 所对应的 key-value 对,返回被删除 key 所关联的 value,如果该 key 不存在,则返回 null |
boolean remove(Object key,Object value) | 从该 Map 中成功地删除该 key-value 对,该方法返回 true,否则返回 false |
int size( ) | 返回该 Map 里的 key-value 对的个数 |
Collection values( ) | 返回该 Map 里所有 value 组成的 Collection |
1.1.2 Map 的遍历
Map 中包括一个内部类 Entry,该类封装了一个 key-value 对。Entry 包含如下三个方法:
Object getKey( )
:返回该Entry里包含的key值。
Object getValue( )
:返回该Entry里包含的value值。
Object setValue(V value)
:设置该Entry里包含的value值,并返回新设置的value值。
可以通过遍历 Entry 进而遍历 Map。
public class Test {
public static void main(String[] args) {
// 创建 Map 集合对象
Map<String, String> map = new HashMap<>();
// 添加元素到集合
map.put("壹", "刘备");
map.put("贰", "曹操");
map.put("叁", "孙权");
// 获取 所有的 entry 对象
Set<Map.Entry<String, String>> entries = map.entrySet();
// 遍历得到每一个 entry 对象
for (Map.Entry<String, String> entry : entries) {
// 进而遍历 Map
String key = entry.getKey();
String value = entry.getValue();
System.out.println( key + " : " + value);
}
}
}
通过 Map 提供的 keySet( ) 方法获取所有 key 组成的集合,进而遍历 Map 中所有的 key-value 对
public class Test {
public static void main(String[] args) {
// 创建 Map 集合对象
Map<String, String> map = new HashMap<>();
// 添加元素到集合
map.put("壹", "刘备");
map.put("贰", "曹操");
map.put("叁", "孙权");
// 获取 所有的 entry 对象
Set<String> strings = map.keySet();
// 遍历得到每一个 map 对象
for (String string : strings) {
String value = map.get(string);
System.out.println( string + " : " + value);
}
}
}
1.2 Map 的实现类
1.2.1 HashMap 集合
当给 HashMap 中存放自定义对象时,如果自定义对象作为 key 存在,这时要保证对象唯一,必须复写对象的 hashCode 和 equals 方法。HashMap 提供了一个保证 Map 中存取的顺序一致的 LinkedHashMap 集合(通过链表结构可以保证元素的存取顺序一致)。
public class Test {
public static void main(String[] args) {
// 创建 Map 集合对象
Map<String, String> map = new LinkedHashMap<>();
// 添加元素到集合
map.put("壹", "刘备");
map.put("贰", "曹操");
map.put("叁", "孙权");
// 获取 所有的 entry 对象
Set<String> strings = map.keySet();
// 遍历得到每一个 map 对象
for (String string : strings) {
String value = map.get(string);
System.out.println( string + " : " + value);
}
}
}
1.2.2 Hashtable 集合
从 Hashtable 的类名上就可以看出它是一个古老的类,它的命名甚至没有遵守 Java 的命名规范,现在 Hashtable 本身已经淡出了我们的视野。但是 Hashtable 提供了一个 Properties 子类,该对象在处理属性文件时特别方便,Properties 类可以把 Map 对象和属性文件关联起来,从而可以把 Map 对象中的 key-value 对写入属性文件中,也可以把属性文件中的 “属性名=属性值” 加载到 Map 对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以 Properties 里的 key、value 都是字符串类型。
常用方法
方法名 | 说明 |
---|---|
String getProperty(String key) | 获取 Properties 中指定属性名对应的属性值 |
String getProperty(String key,String defaultValue) | 获取 Properties 中指定属性名对应的属性值 ,如果 Properties 中不存在指定的 key 时,则该方法指定默认值 |
Object setProperty(String key,String value) | 设置属性值 |
void load(InputStream inStream) | 从属性文件中加载 key-value 对,把加载到的 key-value 对追加到 Properties 里 |
void store(OutputStream out,String comments) | 将 Properties 中的 key-value 对输出到指定的属性文件中 |
1.2.3 SortedMap 接口
SortedMap 接口提供了一个 key 有序的子类 TreeMap。
TreeMap 构造方法
public TreeMap( )
使用其键的自然排序构造一个 TreeMap。 插入 TreeMap 的所有键都必须实现 Comparable 接口。 此外,所有这些 key 必须是相互可比的 : k1.compareTo(k2) 不能为 ClassCastException 中的任何键 k1 和 k2 。 如果试图将一个违反此约束的键放入 TreeMap 中(例如,用户尝试将一个字符串键放入一个键为整数的 TreeMap 中),则 put(Object key, Object value) 方法将抛出 ClassCastException 。
public TreeMap(Comparator<? super K> comparator)
构造一个 TreeMap,按照给定的比较器排序。 插入到 TreeMap 中的所有键必须由给定的比较器相互比较 : comparator.compare(k1, k2) 不得为 ClassCastException 中的任何键 k1 和 k2 。 如果试图将一个违反此约束的键放入 TreeMap 中,则 put(Object key, Object value) 方法将抛出 ClassCastException 。
参数
comparator - 将用于创建 TreeMap 的比较器。