目录
双列集合Map
1.1 概述
1.2 特点
1.3 Map接口中的常用方法
1.3.1 练习
1.4 HashMap集合
1.4.1 概述
1.4.2 特点
1.5 LinkedHashMap集合
1.5.1 概述
1.5.2 特点
1.6 TreeMap集合
1.6.1 概述
1.6.2 特点
1.7 Map集合练习
1.8 HashMap、LinkedHashMap、TreeMap的区别
双列集合Map
1.1 概述
java.util.Map:Map是一种接口,用于表示键值对的集合。它提供了一种将键映射到值的方式,其中每个键只能映射到一个值。Map提供了一组方法来操作和访问其中的元素。Map中的键是唯一的,每个键对应一个值。可以通过键来访问和更新值。常见的实现类包括HashMap、LinkedHashMap、TreeMap等。
1.2 特点
- Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)。
- Map集合中的元素,key和value的数据类型可以相同,也可以不同。
- Map集合中的元素,key是不允许重复的,value是可以重复的。
- Map集合中的元素,key和value是一一对应的。
1.3 Map接口中的常用方法
public V put(K key,V value):把指定的键与指定的值添加到Map集合中。
返回值:V
存储键值对的时候,key不重复,返回值V为null。
存储键值对的时候,key重复,会使用新的value值替换Map中重复的value,返回被替换掉的value值。
public V remove(Object key):把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
返回值:V
key存在,V返回被删除的值。
key不存在,V返回null。
public V get(Object key):根据指定的键,在Map集合中获取对应的值。
返回值:V
可以存在,V返回对应的value值。
可以不存在,V返回null。
public boolean containsKey(Object key):判断集合中是否包含指定的键。
返回值:包含返回true,不包含返回false。
public Set<K> keySet():获取Map集合中所有的键,存储到Set集合中。
作用:通过键找值的方式去遍历Map集合。
实现步骤:
1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中。
2.遍历set集合,获取Map集合中的每一个key。
3.通过Map集合中的方法get(key),通过key找到value。
public Set<Map.Entry<K,V>> entrySet:获取到Map集合中所有的键值对对象的集合(Set集合)。
作用:使用Entry对象遍历Map集合。
实现步骤:
1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中。
2.遍历Set集合,获取每一个Entry对象。
3.使用Entry对象中的方法getKey和getValue获取键和值。
1.3.1 练习
package com.zhy.coll;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class TestMap {public static void main(String[] args) {//创建Map集合对象,多态Map<String,Integer> map = new HashMap<>();//1.put:将指定的键与指定的值添加到Map集合中map.put("zhangsan",17);map.put("lisi",29);Integer i = map.put("wangwu",30);Integer i2 = map.put("zhangsan",27);System.out.println("存储不重复key的返回值:" + i);System.out.println("存储重复key的返回值:" + i2);System.out.println("初始化Map集合:" + map);System.out.println();//2.remove:根据key移除Map集合中的元素Integer i3 = map.remove("zenghai");Integer i4 = map.remove("lisi");System.out.println("移除集合中不存在key的返回值:" + i3);System.out.println("移除集合中存在key的返回值:" + i4);System.out.println("移除元素指定key之后的集合:" + map);System.out.println();//3.get:根据key获取集合中对应的值Integer i5 = map.get("zhangsan");Integer i6 = map.get("haidi");System.out.println("获取集合中存在的key的返回值:" + i5);System.out.println("获取集合中不存在的key的返回值:" + i6);System.out.println();//4.containsKey:判断集合中是否包含key,包含返回true,不包含返回falseSystem.out.println("集合中是否包含zhangsan的key:" + map.containsKey("zhangsan"));System.out.println("集合中是否包含zengyue的key:" + map.containsKey("zengyue"));System.out.println();//5.keySet:将map中所有的键存储到Set集合中,然后通过迭代器或者增强for遍历System.out.print("使用keySet遍历Map集合:");Set<String> keySets = map.keySet();for (String key : keySets){Integer value = map.get(key);System.out.print(key + "=" + value + "\t");}//6.entrySet:将map中所有的键值对存储在Set集合中,使用Entry对象遍历Map集合System.out.print("\n使用entrySet遍历Map集合:");Set<Map.Entry<String, Integer>> entrySets = map.entrySet();for (Map.Entry<String, Integer> keyAndValue : entrySets){String key = keyAndValue.getKey();Integer value = keyAndValue.getValue();System.out.print(key + "=" + value + "\t");}}
}
注:HashMap存储自定义类型键值,Map集合保证键是唯一的:作为key的元素,必须重写hashCode和equals方法,以保证key唯一。
1.4 HashMap集合
1.4.1 概述
java.util.HashMap:HashMap是一种实现了Map接口的键值对存储结构。它是基于哈希表的实现,通过哈希函数将键映射到数组中的位置来存储和检索值。
1.4.2 特点
- HashMap集合底层是哈希表:查询的速度特别的快。
- HashMap集合是一个无序的集合,不保证元素的顺序,也不保证迭代顺序。
- HashMap允许存储null键和null值,并允许多个null值存储。
- HashMap中的键和值可以是任意类型的对象,通过hashCode()和equals()方法来确定键的唯一性。如果两个键的hashCode()值相等并且equals()方法返回true,则将被视为同一个键,后插入的值会覆盖旧值。
package com.zhy.coll;import java.util.HashMap;public class TestMap {public static void main(String[] args) {//HashMap特点:无序,不可存储重复元素HashMap<String,Integer> hashMap = new HashMap<>();hashMap.put("zhangsan",18);hashMap.put("lisi",30);hashMap.put("wangwu",27);hashMap.put("zhangsan",35);System.out.println(hashMap);//输出:{lisi=30, zhangsan=35, wangwu=27}}
}
1.5 LinkedHashMap集合
1.5.1 概述
java.util.LinkedHashMap:LinkedHashMap是Java的一种实现了Map接口的类,它继承自HashMap类。它是一种既保留了插入顺序又保留了访问顺序的Map,即可以通过插入顺序或访问顺序来遍历。与HashMap不同的是,LinkedHashMap在内部使用了双向链表来维护插入顺序或访问顺序。
1.5.2 特点
- LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)。
- LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的。
package com.zhy.coll;import java.util.LinkedHashMap;public class TestMap {public static void main(String[] args) {//LinkedHashMap特点:有序(根据键插入的顺序),不可存储重复元素//如果遇到重复元素,键不变,值改为最新的LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap();linkedHashMap.put("zhangsan",18);linkedHashMap.put("lisi",30);linkedHashMap.put("wangwu",27);linkedHashMap.put("zhangsan",35);System.out.println(linkedHashMap);//输出:{zhangsan=35, lisi=30, wangwu=27}}
}
1.6 TreeMap集合
1.6.1 概述
java.util.TreeMap:在Java中,TreeMap是一种实现了SortedMap接口的类,它按照键的自然顺序进行排序。它是一个有序的键值对集合,基于红黑树数据结构实现,可以快速地进行插入、删除和查找操作。
1.6.2 特点
- 键值对按 键 的顺序进行排序,并且支持快速的查找操作。
- TreeMap可以存储不重复的键值对,键不能为null,值可以为null。
- TreeMap是基于红黑树实现的,所以插入、删除和查找操作的时间复杂度都为O(log n)。
package com.zhy.coll;import java.util.*;public class TestMap {public static void main(String[] args) {Map<String,Integer> map = new TreeMap<>();map.put("aaa",28);map.put("ccc",30);map.put("bbb",34);//输出:{aaa=28, bbb=34, ccc=30}//treeMap会对存储的元素根据键进行排序System.out.println(map);//TreeMap的key不能存储空值,会引发空指针异常:java.lang.NullPointerExceptionmap.put(null,null);//但是value可以存储nullmap.put("ddd",null);}
}
1.7 Map集合练习
计算一个字符串中每个字符出现的次数。
package com.zhy.coll;import java.util.*;public class TestMap {public static void main(String[] args) {//1.定义一个map集合,键为字符,值为字符出现的次数Map<Character,Integer> map = new LinkedHashMap<>();//2.使用Scanner类,从键盘接收一个字符串Scanner sc = new Scanner(System.in);String str = sc.nextLine();//3.将字符串转换成字符数组,遍历每一个字符char[] strArray = str.toCharArray();for (char c : strArray){//4.判断字符,如果map中已经存在,则根据key或者对应的value,然后+1if (map.containsKey(c)){map.put(c,map.get(c) + 1);}else {//5.如果map中不存在,则将字符加入到map中,value=1map.put(c,1);}}//6.遍历集合Set<Character> characters = map.keySet();for (Character c : characters){System.out.println(c + "出现了" + map.get(c) + "次");}}
}
1.8 HashMap、LinkedHashMap、TreeMap的区别
HashMap、LinkedHashMap和TreeMap是Java中常用的三种Map实现类,它们的区别如下:
集合 | 数据结构 | 元素是否有序 | 元素是否排序 | 性能 | 键为空 |
---|---|---|---|---|---|
HashMap | 哈希表 | 无序 | 不排序 | 高 | 允许 |
LinkedHashMap | 哈希表+链表 | 按照插入顺序 | 不排序 | 中 | 允许 |
TreeMap | 红黑树 | 从小到大排序 | 排序 | 低 | 不允许 |
总结:HashMap适用于大部分场景下的快速查找;LinkedHashMap适用于保持插入顺序的场景;TreeMap适用于有序存储和范围查找的场景。