贝利信息

Java对象数组与集合类使用技巧

日期:2026-01-11 00:00 / 作者:P粉602998670
Java中对象数组不能直接用Arrays.asList转List,因其将整个数组作为单个元素封装;正确做法是用Arrays.stream().toList()或防御性拷贝。

Java中对象数组不能直接用Arrays.asList转成List

这是新手最常踩的坑:把Person[]传给Arrays.asList(),结果发现修改返回的List不影响原数组,或者调用add()直接抛UnsupportedOperationException

根本原因是Arrays.asList()对基本类型数组和对象数组处理不同——它把对象数组整体当做一个元素封装进List,而不是展开成元素列表。比如Arrays.asList(new Person[]{p1, p2})返回的是一个只含1个元素(即那个数组引用)的List

ArrayList与LinkedList在频繁插入/删除时性能差异明显

很多人以为“链表适合增删”,但没注意前提:必须是在**中间位置随机插入/删除**,且已持有目标位置的引用(比如迭代器)。否则,光是定位就抵消了结构优势。

常见误用场景:用LinkedList做队列但反复调用list.get(i)查中间元素;或用ArrayList在首部add(0, item)——这会导致所有后续元素位移,O(n)时间。

HashMap的key为自定义对象时必须重写hashCode()和equals()

否则两个逻辑相等的对象(比如new Person("Alice", 30)new Person("Alice", 30))会被当作不同key存入,导致get()查不到、containsKey()返回false

关键点不在“要不要重写”,而在于**必须同时重写且逻辑一致**:如果equals()认为a和b相等,它们的hashCode()必须返回相同值;反之不成立。

使用Collections.unmodifiableList()后仍可能被内部修改

Collections.unmodifiableList()返回的只是原始List的一个只读包装,它不阻止你通过原始引用去改内容。也就是说,如果还有别的变量指向同一个ArrayList,那它依然能被add()clear()等操作修改,而只读视图也会跟着变。

真实项目里最容易被忽略的,是对象数组转集合时的语义陷阱,以及不可变包装背后共享引用的问题——这两处错误往往不会立刻报错,而是让数据在某个深夜批量处理时悄悄错乱。