踩坑系列-HashMap,key为数字时一定需要注意一下类型

本文通过一个具体的案例探讨了在Java中使用HashMap时,不同类型的Key(如int与Long)可能导致的问题,并给出了相应的建议。

一、CASE

 public static void demo1() {
        ArrayList<Person> list = new ArrayList<>();
        Person p1 = new Person();
        p1.setName("张三");
        p1.setAge(35);
        p1.setAddress("成都");
        list.add(p1);
        HashMap<Long, Person> map = new HashMap<>();
        for (Person p : list) {
            map.put(p.getAge(), p);
        }
        int a = 35;
        Person person1 = map.get(a);
        System.out.println("person1:" + person1);
        long b = 35L;
        Person person2 = map.get(b);
        System.out.println("person2:" + person2);
    }

上面这段代码,运行的结果为

person1:null
person2:Person{name='张三', age=35, address='成都'}

person1查出来为null,person2查出来为正常

二、结论

1、出现以上情况的原因是我们在实例化HashMap的时候指定了key为Long,但是a变量确实个int类型,当然取出来为null

2、但是你会发现并没有报错,原因在于map的get方法key值为Object,因此无论是什么类型都不会报语法上的错误

 

三、建议

1、如果可以请使用string作为key,减少不必要的错误。 

<think>好的,我现在需要回答用户关于HashMap和ArrayList的区别,以及它们的key是否可以重复或为空的问题。首先,我得确保自己正确理解这两个数据结构的基本概念和特性。 首先,HashMap和ArrayList都是Java集合框架的一部分,但它们的用途和结构完全不同。ArrayList是一个动态数组,可以动态增长和缩减,而HashMap是基于哈希表的Map接口实现,存储键值对。用户可能想了解它们的主要区别,包括存储结构、元素访问方式、是否允许重复元素或空值等。 接下来,我需要分别分析两者的特性: 1. **数据结构差异**: - ArrayList基于动态数组,元素按插入顺序存储,可以通过索引快速访问。 - HashMap基于哈希表,使用键值对存储,通过键的哈希值来定位存储位置。 2. **元素唯一性**: - ArrayList允许重复元素,因为它是列表结构,可以添加多个相同的元素。 - HashMap的键必须是唯一的,如果重复添加相同的键,新值会覆盖旧值,但值可以重复。 3. **空值处理**: - ArrayList允许存储多个null值,因为元素可以重复。 - HashMap允许一个null键和多个null值,而Hashtable则不允许null键或值(根据引用[4]中的代码示例,用户可能混淆了Hashtable和HashMap,但这里需要明确HashMap允许null)。 然后,用户的问题还涉及key的可重复性和是否允许空值。这里需要明确,ArrayList没有键的概念,它只有元素,所以问题中的“key”可能是指元素本身。而HashMap确实有键,所以需要区分两者的不同。 可能需要注意用户可能存在的误解,比如将ArrayList的元素误认为是键,或者混淆了Map和List的结构。需要明确说明ArrayList没有键,只有索引,而索引是整数且不可重复的,但元素可以重复和包含null。而HashMap的键必须唯一,但值可以重复,并且允许一个null键。 另外,引用[3]提到HashMap允许null键和值,而引用[4]中的代码示例也展示了HashMap可以存储null键和值,而Hashtable不行。这需要整合到回答中,说明HashMap在这方面的特性。 总结回答的结构应该分点说明两者的区别,包括数据结构、元素/键的唯一性、空值处理等,并分别指出key是否可重复或为空的情况。同,可能需要引用提供的资料来支持回答,比如关于HashMap非线程安全、允许null键值的部分。 最后,生成的相关问题需要与主题相关,例如询问应用场景、性能比较、线程安全等,确保问题有针对性且帮助用户深入理解。</think>### HashMap与ArrayList的区别及特性分析 #### 一、核心区别 1. **数据结构与存储方式** - **ArrayList**:基于动态数组实现,存储**单一元素**,按插入顺序维护索引位置。访问元素的间复杂度为$O(1)$(通过索引直接访问)[^3]。 - **HashMap**:基于哈希表实现,存储**键值对(key-value pairs)**,通过键的哈希值快速定位存储位置,平均查询间复杂度为$O(1)$。 2. **元素唯一性与重复性** - **ArrayList**:允许**重复元素**,例如可以添加多个`"apple"`到列表中。 - **HashMap**:键(key)必须**唯一**,重复添加相同键会覆盖旧值;值(value)可以重复。 3. **空值(null)支持** - **ArrayList**:允许存储**多个null元素**,例如`list.add(null)`可多次调用。 - **HashMap**:允许**一个null键**和**多个null值**(例如`map.put(null, "value")`和`map.put("key", null)`均合法)[^4]。 4. **元素访问方式** - **ArrayList**:通过**整数索引**访问元素(如`list.get(0)`)。 - **HashMap**:通过**键对象**访问值(如`map.get("key")`)。 #### 二、Key的重复性与空值规则 | 特性 | ArrayList | HashMap | |---------------------|-------------------|------------------| | 是否涉及“键(key)” | 无(仅有元素) | 是(键值对结构) | | 键是否可重复 | 不适用 | 不可重复 | | 键是否可为null | 不适用 | 允许一个null键 | | 元素/值是否可重复 | 允许重复元素 | 允许重复值 | | 元素/值是否可为null | 允许多个null元素 | 允许多个null值 | #### 三、典型应用场景 - **ArrayList**:需按顺序存储且频繁通过索引访问的场景,如日志记录、批量数据处理。 - **HashMap**:需通过唯一键快速查找或更新数据的场景,如缓存系统、配置项管理。 #### 四、代码示例 ```java // ArrayList示例:允许重复元素和null ArrayList<String> list = new ArrayList<>(); list.add("apple"); // 允许重复 list.add("apple"); list.add(null); // 允许null list.add(null); // HashMap示例:键唯一且支持一个null键 HashMap<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("apple", 2); // 覆盖旧值,键不可重复 map.put(null, 3); // 允许一个null键 map.put("banana", null); // 允许多个null值 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值