[Java进阶] Map集合相关

本文详细介绍了HashMap的特点,包括其哈希表结构、键值唯一性、存储null的注意事项以及常用的增删改查方法。同时,通过实例展示了如何使用HashMap计算字符串中字符的个数。此外,还讲解了LinkedHashMap的特点,它在HashMap基础上保持了插入和取出的顺序。文章提供了三种遍历HashMap的方法,并在最后给出了计算字符串中字符个数的完整应用示例。
摘要由CSDN通过智能技术生成

目录

HashMap特点

构造方法

常用方法

遍历

LinkedHashMap特点

应用(计算字符串中字符的个数)


Map接口是作为所有双列集合的父接口, map特点是 1) 没有索引概念 2) 键唯一,值不唯一

HashMap特点

1. 底层是哈希表结构, 增删快, 查询快

2. 键是唯一的, 值可以重复

3. 键值中可以存null, 但不建议, 容易混淆

4. 没有索引概念

5. 自定义对象作为键时候, 要重写它的hashcode和equals方法

构造方法

创建空的hashMap, 初始长度为16, 负载因子0.75

HashMap<String,Integer> hashMap = new HashMap<>();

常用方法

hashMap继承的抽象类中重写了toString方法, 因此hashMap也可以完成直接打印输出集合内容

增:

1.put(K key, V value): 返回被覆盖的value值, 如果之前没有相同key对象, 则返回null

HashMap<String,Integer> hashMap = new HashMap<>();
//添加  向hashmap中添加数据
hashMap.put("张三",29);
hashMap.put("李四",27);
hashMap.put("赵六",31);
//返回添加后  被覆盖的值内容 表中没有返回null
Integer i1 = hashMap.put("王五",25);

删:

2.remove(K key): 删除指定键的key和value, 返回删除的value值

Integer i2 = hashMap.remove("李四");
System.out.println("删除李四和对应的值:"+i2);

3.remove(K key, V value):  根据指定的key和value进行匹配并删除返回true, 没有匹配到返回false

boolean result = hashMap.remove("李四", 30);
System.out.println("删除map中年龄30岁的李四, 是否查询到并删除:"+result);

改:

4.replace(K key,V value): 修改key的值为value, 无返回值

hashMap.replace("张三",15);
System.out.println("修改后的map:"+hashMap);

5.replace(K key, V oldValue, V newValue): 将key的oldValue修改成newValue, 返回boolean结果

boolean result2 = hashMap.replace("赵六", 31, 20);
System.out.println("将31岁的赵六年龄修改为20, 返回结果:"+result2);
System.out.println("修改后的map:"+hashMap);

查:

6.get(K key): 获取key对应的value值

map里只能通过键找值, 通过传入的键返回对应的值. 如果不存在返回null , 存在 返回值

为什么不能通过值找键???

一个键对应一个值, 但一个值可能多个键, 不满足一一映射的关系, 不确定找哪个键

Integer i3= hashMap.get("王五");
System.out.println("找到key为王五的内容值为:"+i3);

7.containsKey(Object key): 判断hashMap的键中有没有key, 返回boolean结果

boolean r1 = hashMap.containsKey("张三");

8.containsValue(Object value): 判断hashMap的值中有没有value, 返回boolean结果

boolean r2 = hashMap.containsValue(20);

9.values(): 返回map集合中的所有值到Collection集合中

Collection<Integer> values = hashMap.values();

遍历

方式一: 使用keySet()

将hashMap中所有的key封装到hashSet集合中, 通过每次获取set集合中的key,返回对应的值

HashMap<String,Integer> hashMap = new HashMap<>();

hashMap.put("张三",29);
hashMap.put("李四",27);
hashMap.put("赵六",31);

//将key统一存在set集合中 , 通过set中的key去找对应的value
Set<String> set1 = hashMap.keySet();

for (String s : set1) {
    Integer value = hashMap.get(s);
    System.out.println("hashmap的key是:"+s+",value是:"+value);
}

方式二: 使用entrySet()方法

将key和value封装成一个entry键值对, 存放在set中, 通过entry对象调用getKey,getValue方法遍历

Set<Map.Entry<String, Integer>> entrySet = hashMap.entrySet();

for (Map.Entry<String, Integer> entry : entrySet) {
    System.out.println("hashmap的key是:"+entry.getKey()+",hashmap的value是:"+entry.getValue());
}

方式三: 直接将所有的valule放进Collection中

System.out.println("直接将所有的value放进Collection中");
Collection<Integer> values = hashMap.values();
System.out.println(values);

LinkedHashMap特点

1. 数据结构: 哈希表+链表

2. 键唯一, 值可以重复

3. 存入取出顺序相同

4. 没有索引概念

应用(计算字符串中字符的个数)

        System.out.println("请输入字符串:");
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();

        //1.将字符串拆分成字符
        char[] chars = str.toCharArray();

        //2.创建存放字符包装类和String类的hashMap
        HashMap<Character,Integer> hashMap = new HashMap<>();
        //3.遍历字符数组, 如果hashMap中含有该字符, 在其值的基础上+1
        //如果没有该字符, 则存储, 值为1
        for (char c : chars) {
            if (hashMap.containsKey(c)){
                hashMap.put(c,hashMap.get(c)+1);
            }else {
                hashMap.put(c,1);
            }
        }

        //4.遍历打印key 和 value
        for (Map.Entry<Character, Integer> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey()+"字符的个数:"+entry.getValue());
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值