Map集合中的同一键值key重复赋值(Map.put()、Map.putAll())

前言:

验证:对Map集合中的同一键值key重复赋值?
结果:对Map集合中的同一键值key重复赋值会覆盖之前的结果。

验证如下:

    /**
     * 验证:对Map集合中的同一键值key重复赋值?
     * 结果:对Map集合中的同一键值key重复赋值会覆盖之前的结果
     */
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("data", "100");
    map.put("msg", "success");
    map.put("info", "你的数学成绩已合格");
    System.out.println("map的大小:"+map.size());
    System.out.println("msg:"+map.get("msg"));
    map.put("msg", "fail");
    System.out.println("msg:"+map.get("msg"));
    
    /**
     * 整合后的Map集合大小是5而不是6,那是因为两个Map集合中有一个重复的键名“info”。
     * 
    

<think>好的,我现在需要回答用户的问题:如何在Java中设置Map以实现大小写不敏感。首先,我要回忆一下Java中Map的基本知识。用户提到希望键的大小写不敏感,比如存入"Key"和"key"被视为同一个键。这需要覆盖Map的键比较方式,通常涉及哈希码和等值比较的处理。 首先想到的是使用现有的第三方库,比如Apache Commons Collections中的CaseInsensitiveMap。根据引用[3],CaseInsensitiveMap可以直接使用,不需要自己实现equals和hashCode方法。用户只需导入相应的依赖,然后创建实例即可。这种方法简单快捷,适合不想自己造轮子的开发者。 但是,如果用户不想引入外部库,可能需要自己扩展现有的Map实现。例如,使用TreeMap并传入一个自定义的Comparator,比如String.CASE_INSENSITIVE_ORDER。这样在比较键时会忽略大小写。引用[2]提到,直接使用等号赋值可能不生效,需要用putAll方法。这可能是因为构造新的CaseInsensitiveMap时需要将旧Map的所有条目复制进去。 另外,还可以考虑包装一个现有的HashMap,重写get和put方法,在存入和取出键时统一转换为小写或大写。例如,在put时把键转成小写,然后在get时也转成小写。这种方法需要自定义一个类,可能比较繁琐,但不需要第三方库。 需要提醒用户注意,如果使用TreeMap,虽然键比较不区分大小写,但存储的键的实际值会是原始的大小写形式。而使用CaseInsensitiveMap可能保留原始的键形式。另外,性能方面,TreeMap的查找是O(log n),而HashMap是O(1),所以如果性能敏感,可能需要权衡。 还要注意,在转换键的大小写时,要考虑区域设置的问题,比如某些语言的大小写转换规则不同。使用String的toLowerCase()或toUpperCase()方法时,最好指定Locale,比如使用toLowerCase(Locale.ROOT)来避免意外行为。 总结下来,主要的实现方法有三种:使用第三方库如CaseInsensitiveMap,使用TreeMap自定义比较器,或者自定义包装类处理键的大小写转换。需要根据项目需求和环境选择合适的方法。</think>在Java中实现大小写不敏感的Map,主要有以下三种方法: ### 方法1:使用Apache Commons的CaseInsensitiveMap ```java import org.apache.commons.collections.map.CaseInsensitiveMap; // 创建不区分大小写的Map Map<String, Object> map = new CaseInsensitiveMap(); map.put("Key", 1); System.out.println(map.get("key")); // 输出1 [^3] ``` *特点*:直接继承自LinkedHashMap,保留插入顺序且无需手动处理键转换 ### 方法2:使用TreeMap自定义比较器 ```java Map<String, Object> caseInsensitiveMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); caseInsensitiveMap.put("Apple", 10); System.out.println(caseInsensitiveMap.get("aPpLe")); // 输出10 [^2] ``` *注意*:需通过`putAll()`转换现有Map,直接赋值无效 ### 方法3:自定义包装类 ```java public class CaseInsensitiveHashMap<K extends String, V> extends HashMap<K, V> { @Override public V put(K key, V value) { return super.put((K) key.toLowerCase(), value); } @Override public V get(Object key) { return super.get(key.toString().toLowerCase()); } } ``` *注意*:需处理null值校验和类型转换异常 ### 性能对比 | 方法 | 时间复杂度 | 空间复杂度 | 依赖项 | |---------------------|------------|------------|-------------| | CaseInsensitiveMap | O(1) | O(n) | 需要第三方库 | | TreeMap | O(log n) | O(n) | 无 | | 自定义HashMap | O(1) | O(n) | 无 | ### 注意事项 1. JSON序列化时需注意键的大小写处理[^4] 2. 使用`toLowerCase()`建议指定Locale:`key.toLowerCase(Locale.ROOT)` 3. 并发环境建议使用`ConcurrentHashMap`+包装器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值