java.util.Map<K,V>集合
Map集合的特点
-
Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
-
Map集合中的元素,key和value的数据类型可以相同,也可以不同
-
Map集合中的元素,key是不允许重复的,value是可以重复的
- Map集合中的元素,key和value是一一对应
常用实现类:
-
HashMap,底层是哈希表:查询的速度特别快,HashMap集合是一个无序的集合,存储元素和取出元素的顺序可能不一致,是线程不安全的集合,是多线程的集合,速度快;可以存储null值,null键
-
LinkedHashMap,底层是哈希表+链表(保证迭代顺序),是一个有序的集合,存储元素和取出元素的顺序一致;可以存储null值,null键
-
Map接口中的常用方法
public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中 public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值 public V get(Object key) 根据指定的键,在Map集合中获取对应的值 public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中 public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)
HashMap存储自定义类型的键值
import java.util.HashMap; import java.util.Map; import java.util.Set; /* HashMap存储自定义类型键值 Map集合保证key是唯一的: 作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一 */ public class Demo01HashMapSavePerson { public static void main(String[] args) { show02(); } /* HashMap存储自定义类型键值 key:Person类型 Person类就必须重写hashCode方法和equals方法,以保证key唯一 value:String类型 可以重复 */ private static void show02() { //创建HashMap集合 HashMap<Person,String> map = new HashMap<>(); //往集合中添加元素 map.put(new Person("女王",18),"英国"); map.put(new Person("秦始皇",18),"秦国"); map.put(new Person("普京",30),"俄罗斯"); map.put(new Person("女王",18),"毛里求斯"); //使用entrySet和增强for遍历Map集合 Set<Map.Entry<Person, String>> set = map.entrySet(); for (Map.Entry<Person, String> entry : set) { Person key = entry.getKey(); String value = entry.getValue(); System.out.println(key+"-->"+value); } } /* HashMap存储自定义类型键值 key:String类型 String类重写hashCode方法和equals方法,可以保证key唯一 value:Person类型 value可以重复(同名同年龄的人视为同一个) */ private static void show01() { //创建HashMap集合 HashMap<String,Person> map = new HashMap<>(); //往集合中添加元素 map.put("北京",new Person("张三",18)); map.put("上海",new Person("李四",19)); map.put("广州",new Person("王五",20)); map.put("北京",new Person("赵六",18)); //使用keySet加增强for遍历Map集合 Set<String> set = map.keySet(); for (String key : set) { Person value = map.get(key); System.out.println(key+"-->"+value); } } }
JDK9对集合添加的优化
import java.util.List; import java.util.Map; import java.util.Set; /* JDK9的新特性: List接口,Set接口,Map接口:里边增加了一个静态的方法of,可以给集合一次性添加多个元素 static <E> List<E> of(E... elements) 使用前提: 当集合中存储的元素的个数已经确定了,不在改变时使用 注意: 1.of方法只适用于List接口,Set接口,Map接口,不适用于接接口的实现类 2.of方法的返回值是一个不能改变的集合,集合不能再使用add,put方法添加元素,会抛出异常 3.Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常 */ public class Demo01JDK9 { public static void main(String[] args) { List<String> list = List.of("a", "b", "a", "c", "d"); System.out.println(list);//[a, b, a, c, d] //list.add("w");//UnsupportedOperationException:不支持操作异常 //Set<String> set = Set.of("a", "b", "a", "c", "d");//IllegalArgumentException:非法参数异常,有重复的元素 Set<String> set = Set.of("a", "b", "c", "d"); System.out.println(set); //set.add("w");//UnsupportedOperationException:不支持操作异常 //Map<String, Integer> map = Map.of("张三", 18, "李四", 19, "王五", 20,"张三",19);////IllegalArgumentException:非法参数异常,有重复的元素 Map<String, Integer> map = Map.of("张三", 18, "李四", 19, "王五", 20); System.out.println(map);//{王五=20, 李四=19, 张三=18} //map.put("赵四",30);//UnsupportedOperationException:不支持操作异常 } }