ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、Map 集合 不属于Collection集合的子集合 Map<key ,value> ## 二、Map集合的特点: 1. 可以有null,只能有一个 2. 以键值对的形式,存储元素 3. Map集合中的元素, key是不允许重复的,value是可以重复的 4. Map集合中的元素, key和value是一一对应 ## 三、Map的实现类: #### HashMap 底层是用`哈希表`实现的,查询的速度特别的快 `HashMap`集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致 #### TreeMap 底层是用`二叉树`实现的 ### `HashMap` 类与 `Hashtable` 的区别? > `HashMap` :线程不同步,不允许null键和null值 > > `Hashtable`: 线程同步,允许null键和null值 > Map集合没有迭代器,要想遍历集合中的内容,必须把其转为set集合进行 ## 四、Map集合常用的方法: | put(); | | | :---------: | :--------------------------------------------- | | get(); | key存在,返回对应的value值;key不存在,返回null | | remove(); | key存在,v返回被删除的值;key不存在,v返回null | | entrySet(); | 返回map集合的键值对set集合,常用 | | keySet(); | 返回ma集合中所有key的set集合,不常用 | | values(); | 返回map集合中所有value的collection集合,不常用 | ## 五、Map 的练习: ```java public class MapDemo { /** * put */ @Test public void test1() { Map<String, Integer> a = new HashMap<>(); a.put("语文", 99); a.put("数学", 94); a.put("物理", 96); a.put("英文", 15); System.out.println(a); } /** * get(); 根据key值获取value值 */ @Test public void test2() { Map<String, Integer> a = new HashMap<>(); a.put("语文", 99); a.put("数学", 94); a.put("物理", 96); a.put("英文", 15); System.out.println(a); System.out.println(a.get("数学")); } /** * remove */ @Test public void test3() { Map<String, Integer> a = new HashMap<>(); a.put("语文", 99); a.put("数学", 94); a.put("物理", 96); a.put("英文", 15); System.out.println(a.remove("数学")); System.out.println(a); } /** * Map集合的三种collection视图 */ @Test public void test4() { Map<String, Integer> a = new HashMap<>(); a.put("语文", 99); a.put("数学", 94); a.put("物理", 96); a.put("英文", 15); System.out.println(a); // key - value视图 Set<Map.Entry<String,Integer>> s=a.entrySet(); System.out.println(s); // key 视图 Set keys= a.keySet(); System.out.println(keys); // value 视图 Collection c=a.values(); System.out.println(c); } } ``` ## 六、Map 集合遍历键找值方法: ### 1、键找值方式: **即通过元素中的键,获取键所对应的值** ```Set<K> keySet() 返回此映射中包含的键的 Set 视图。``` ### 实现步骤: 1. 使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中 1. 遍历set集合,获取Map集合中的每一个key 2. 通过Map集合中的方法get(key),通过key找到value ```java public static void main(String[] args) { //创建Map集合对象 Map<String,Integer> map = new HashMap<>(); map.put("赵丽颖",168); map.put("杨颖",165); map.put("林志玲",178); //1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中 Set<String> set = map.keySet(); //2.遍历set集合,获取Map集合中的每一个key //使用迭代器遍历Set集合 Iterator<String> it = set.iterator(); while (it.hasNext()){ String key = it.next(); //3.通过Map集合中的方法get(key),通过key找到value Integer value = map.get(key); System.out.println(key+"="+value); } System.out.println("-------------------"); //使用增强for遍历Set集合 for(String key : set){ //3.通过Map集合中的方法get(key),通过key找到value Integer value = map.get(key); System.out.println(key+"="+value); } System.out.println("-------------------"); //使用增强for遍历Set集合 for(String key : map.keySet()){ //3.通过Map集合中的方法get(key),通过key找到value Integer value = map.get(key); System.out.println(key+"="+value); } } ``` ------------ ### 2、使用Entry对象遍历: ```Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。``` ### 实现步骤: 1. 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中 2. 遍历Set集合,获取每一个Entry对象 3. 使用Entry对象中的方法getKey()和getValue()获取键与值 ```java public static void main(String[] args) { //创建Map集合对象 Map<String,Integer> map = new HashMap<>(); map.put("赵丽颖",168); map.put("杨颖",165); map.put("林志玲",178); //1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中 Set<Map.Entry<String, Integer>> set = map.entrySet(); //2.遍历Set集合,获取每一个Entry对象 //使用迭代器遍历Set集合 Iterator<Map.Entry<String, Integer>> it = set.iterator(); while(it.hasNext()){ Map.Entry<String, Integer> entry = it.next(); //3.使用Entry对象中的方法getKey()和getValue()获取键与值 String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key+"="+value); } System.out.println("-----------------------"); for(Map.Entry<String,Integer> entry:set){ //3.使用Entry对象中的方法getKey()和getValue()获取键与值 String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key+"="+value); } } ``` ## List集合、Set集合、Map集合之间的区别? 1. ```List``` 和 ```Set``` 是存储单列数据的集合,```Map``` 是存储键值对这样的双列数据的集合; 2. ​ 1) ```List``` 中存储的数据是有顺序的,并且值允许重复; ​ 2) ```Map``` 中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的; ​ 3) ```Set```中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的```hashcode```决定,即位置是固定的 ​ (Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。 ``` 1. List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素; 2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复; 3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 Tree Set 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator< Type >接口来自定义排序方式。 ``` ![1545816646365](C:\Users\yflad-F\Desktop\JAVA笔记\assets\1545816646365.png)