文章目录
1.Map集合
1.1 双列集合
-
双列集合的特点
- 双列集合一次需要存一对数据,分别为键和值
-
键不能重复,值可以重复
-
键和值是一一对应的,每一个键只能找到自己对应的值
-
键+值这个整体我们称之为 “键值对” 或者 “键值对对象” 在Java中叫做 “Entry对象”
1.2Map集合概述
-
Map集合概述
interface Map<K,V> K:键的类型;V:值的类型
-
Map集合的特点
- 双列集合,一个键对应一个值
- 键不可以重复,值可以重复
-
Map集合的基本功能
Map是双列集合的顶层接口,他的功能是全部双列集合都可以继承使用的
方法介绍
方法名 | 说明 |
---|---|
V put(K key,V value) | 添加元素(添加/覆盖) |
V remove(Object key) | 根据键删除键值对元素(return值) |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
-
添加方法:
-
添加:在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回nu11
-
覆盖:在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
-
1.3Map集合的获取功能【应用】
-
方法介绍
方法名 说明 V get(Object key) 根据键获取值 Set keySet() —> (把key放到一个Set集合里 ) 获取所有键的集合 Collection values() 获取所有值的集合 Set<Map.Entry<K,V>> entrySet() —>(把key放到一个Entry对象里 ) 获取所有键值对对象的集合
1.3.1Map集合的遍历(方式1)
键找值
Set keySet() —> (把key放到一个Set集合里 ) 获取所有键的集合
1.3.2Map集合的遍历(方式2)
Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合
2.HashMap集合
2.1HashMap集合概述和特点
- HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键要存储的是自定义对象,需要重写hashCode和equals方法
特点:
-
HashMap是Map里面的一个实现类,没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
-
特点都是由键决定的:无序、不重复、无索引的都是键
-
哈希表结构HashMap跟HashSet底层原理是一模一样的,都是哈希表结构(红黑树版)
会将Entry对象封装到一起,但是计算哈希值时,使用的是“键”
如果有相同键数据存入,①HashSet会将其直接排除,不存入 ②HashMap会删除原有的,将新的覆盖进去
2.2 HashMap集合应用案例一
-
案例需求
- 某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点依次是 (A、B、C、D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
-
代码实现
-
public class Test3Map3 { public static void main(String[] args) { //存储景点的数组 String[] arr={"A","B","C","D"}; //模拟投票,并将投票存储进集合 ArrayList<String> list = new ArrayList<>(); Random r = new Random(); for(int i=0;i<80;i++){ //随机生成索引,用索引输出字母,达到一个随机生成投票的效果 int index = r.nextInt(arr.length); list.add(arr[index]); } //利用集合进行统计 //用for来重复输入list中的80个景点 //判断新输入的“键”是否已经存在,如果存在,值++ HashMap<String, Integer> sih = new HashMap<>(); for (String s : list) { if(sih.containsKey(s)){ //如果存在这个景点 int count=sih.get(s); count++; sih.put(s,count); }else { //不存在 sih.put(s,1); } } sih.forEach((key,value) ->System.out.println(key+"\t"+value)); //求最大值 int max=0; Collection<Integer> values = sih.values(); for (Integer value : values) { max=max>value?max:value; } //判断哪个景点的次数跟最大值一样 Set<Map.Entry<String, Integer>> entries = sih.entrySet(); for (Map.Entry<String, Integer> entry : entries) { if(max==entry.getValue()){ System.out.println(entry.getKey()+"景点想去的人数最多,人数为"+entry.getValue()); } } } }
2.3 LinkedHashMap集合
-
有序、不重复、无索引。
(这里的有序指的是保证存储和取出的元素顺序一致) -
原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序
3. TreeMap集合
3.1 TreeMap集合概述和特点
- TreeMap底层是红黑树结构
- 依赖自然排序或者比较器排序,对键进行排序
- 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则
3.2 TreeMap集合应用案例二
-
案例需求
- 给定一个字符串,要求统计字符串中每个字符出现的次数。
- 举例: 给定字符串是“aababcabcdabcde”,在控制台输出: “a(5)b(4)c(3)d(2)e(1)”
-
代码实现
public class TestTreeMap3 { public static void main(String[] args) { String str="aababcabcdabcde"; char[] arr = str.toCharArray(); TreeMap<Character, Integer> treeMap = new TreeMap<>(); //用for来重复输入char[] //判断新输入的“键”是否已经存在,如果存在,值++ for (char c : arr) { if(treeMap.containsKey(c)){ int count=treeMap.get(c); count++; treeMap.put(c,count); }else{ //不存在 treeMap.put(c,1); } } treeMap.forEach((key,value)-> System.out.print(key+"("+value+")")); } }