1.Map 集合:
java.util.Map<k,v > 包中
一个双列集合, 一个元素包含两个值 (key,value)
key 和 value 的数据类型可以相同, 也可以不相同
key 不允许重复, value 允许重复
key 和 value 一一对应
Map 常用子类:
HashMap: 实现 Map<k,v > 接口, 多线程的
JDK1.8 之前用数组 + 单向链表, 之后用数组 + 单向链表 / 红黑树 (数组长度超过 8 时使用红黑树), 提高了查询的速度
无序集合, 存储元素和取出元素顺序可能不一致
LinkedHashMap: 继承 HashMap
底层是: 哈希表 + 链表 (保证迭代顺序)
有序集合, 存储和取出元素顺序一直
Hashtable: 实现 Map<k,v > 接口, 单线程的
JDK1.0 就有, 较早期的集合
键或值不可以是 null
单线程速度慢, 已经被 HashMap 代替了
子类 Properties 集合:
依然被大量使用
唯一和 IO 流相结合的集合
Map 常用方法::
public V put(K key,V value): 向 Map 中添加指定 key 和 value 的元素
public V remove(Object key): 删除指定 key 的元素, 返回删除的元素值
public V get(Object key): 根据指定 key, 获取对应 value
boolean containsKey(Object key): 判定 Map 中是否包含指定 key 的元素
public Set<K> keySet(): 获取 Map 集合中所有 key, 放入 Set 集合中
pubic Set<Map.Entry<K,V>> entrySet(): 获得所有 Map 集合中的键值对元素放入 Set 集合中
注:
Map.Entry<K,V>: 在 Map 接口中有一个内部接口 Entry, 当 Map 集合创建时, 内部就会创建一个 Entry 对象, 用于记录键和值对象 (保存键和值的映射关系)
- public class demo03 {
- public static void main(String[] args) {
- Map<String, String> map = new HashMap<>();
- //1. 存入键值对
- map.put("key1", "value1");
- map.put("key2", "value2");
- map.put("key3", "value3");
- map.put("key4", "value4");
- System.out.println(map);
- //2. 删除对应 key 的键值对
- map.remove("key1");
- System.out.println(map);
- //3. 获得对应 key 的 value 值
- System.out.println(map.get("key3"));
- //4. 判断是否包含对应 key 的键值对
- System.out.println(map.containsKey("key5"));
- //5. 遍历 Map 中的所有 key, 方法一
- Set<String> set = map.keySet();
- Iterator<String> iterator = set.iterator();
- while (iterator.hasNext()) {
- System.out.println(iterator.next());
- }
- // 遍历 Map 中的所有 key, 方法二
- // for (String s: map.keySet()
- // ) {
- // System.out.println(s);
- // }
- //6. 遍历 Map 中所有的键值对对象, 方法一
- Set<Map.Entry<String,String>> set2 = map.entrySet();
- Iterator<Map.Entry<String,String>> iterator2 = set2.iterator();
- while (iterator2.hasNext()){
- System.out.println(iterator2.next());
- }
- // 遍历 Map 中所有的键值对对象, 方法二
- // for (Map.Entry<String,String> entry: map.entrySet()
- // ) {
- // System.out.println(entry);
- // }
- }
- }
使用 HashMap 来存储自定义类型:
如果自定义类型作为 key, 则必须重写 hashcode 方法和 equals 方法, 用来保证 key 唯一
如果 Java 自带类型例如 String 作为 key 时, 则不用, 由于 String 已经重写过了这两个方法
- public class demo04 {
- public static void main(String[] args) {
- HashMap<Person,String> hashMap = new HashMap<>();
- hashMap.put(new Person("wzh",24),"person1");
- hashMap.put(new Person("wzh",24),"person2");
- hashMap.put(new Person("wxl",23),"person3");
- hashMap.put(new Person("wzl",23),"person4");
- for (Map.Entry<Person,String> entry: hashMap.entrySet()
- ) {
- System.out.println(entry);
- }
- /**
- * 输出
- * Person{name='wzh', age=24}=person2
- * Person{name='wzl', age=23}=person4
- * Person{name='wxl', age=23}=person3
- */
- }
- }
使用 LinkedHashMap: 存取顺序相同
- public class demo05 {
- public static void main(String[] args) {
- HashMap<String,String> hashMap = new HashMap<>();
- hashMap.put("key3","value3");
- hashMap.put("key2","value2");
- hashMap.put("key4","value4");
- hashMap.put("key1","value1");
- // 存取顺序不相同
- System.out.println(hashMap); //{key1=value1, key2=value2, key3=value3, key4=value4}
- LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<>();
- linkedHashMap.put("key3","value3");
- linkedHashMap.put("key2","value2");
- linkedHashMap.put("key4","value4");
- linkedHashMap.put("key1","value1");
- // 存取顺序相同
- System.out.println(linkedHashMap); //{key3=value3, key2=value2, key4=value4, key1=value1}
- }
- }
2.JDK9 的新特性
集合中新增 of 方法:
List 接口, Set 接口, Map 接口增加一个静态方法 of, 用于一次性给集合添加多个元素, 不适用于接口的实现类
使用 of 方法后不能再向集合中添加元素, 不能调用 add,put 方法否则会抛出异常
对于 Set 接口和 Map 接口使用 of 方法时, 不能有重复元素否则会抛出异常
来源: http://www.bubuko.com/infodetail-3356968.html