0

0

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

P粉602998670

P粉602998670

发布时间:2026-01-11 12:14:02

|

690人浏览过

|

来源于php中文网

原创

java中对象数组不能直接用arrays.aslist转list,因其将整个数组作为单个元素封装;正确做法是用arrays.stream().tolist()或防御性拷贝。

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

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

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

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

  • 正确做法是用Stream
    List<Person> list = Arrays.stream(personArray).toList();
  • 或手动构造:
    List<Person> list = new ArrayList<>(Arrays.asList(personArray));
    (注意这行实际会触发上面说的“包数组”行为,所以必须先确保personArray是泛型安全的;更稳妥写法是用ArrayList::new配合Arrays.stream
  • 如果只是临时遍历,直接用for (Person p : personArray)比转集合更轻量

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

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

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

艺帆网络工作室网站源码1.7.5
艺帆网络工作室网站源码1.7.5

艺帆网络工作室网站源码,是国庆后新一批新概念的网站源码,采用流行的Html5和JS组合流畅顺滑,界面清晰明朗,适合科技类企业和公司建站使用。如果你是想成为一家独特的设计公司,拥有独特的文化,追求品质,而非数量与规模。 这种坚持一直贯穿于项目运作之中,从品牌建立、形象推广设计到品牌形象管理。那可以考虑使用这款艺帆网络工作室网站源码。 这款源码中服务项目和团队程序需要在_template文件夹下的in

下载

立即学习Java免费学习笔记(深入)”;

  • 首尾操作:两者都快(ArrayList首部add(0)慢,尾部add()均摊O(1);LinkedList首尾addFirst/addLast都是O(1))
  • 按索引访问:ArrayList.get(i)是O(1),LinkedList.get(i)是O(n)
  • 按值查找:contains()两者都是O(n),无本质区别
  • 真实建议:默认用ArrayList;只有明确需要在迭代中频繁remove()当前元素(用Iterator.remove()),才考虑LinkedList

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

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

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

  • IDE生成的hashCode()/equals()通常够用,但要注意字段是否可变——如果用可变字段参与计算,之后修改该字段会导致哈希桶错位,再也找不到这个key
  • 推荐用record(Java 14+):
    public record Person(String name, int age) {}
    自动带不可变语义和正确的hashCode()/equals()
  • 如果必须用普通类,把参与hashCode()计算的字段设为final,避免运行时被修改

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

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

  • 真正安全的做法是“防御性拷贝”:
    List<Person> safeList = Collections.unmodifiableList(new ArrayList<>(originalList));
  • 更彻底的方式是用List.copyOf()(Java 10+):
    List<Person> safeList = List.copyOf(originalList); // 返回不可变且独立副本
  • 注意:unmodifiableList()包装后的对象,调用set()add()等会立即抛UnsupportedOperationException,但get()size()正常工作
真实项目里最容易被忽略的,是对象数组转集合时的语义陷阱,以及不可变包装背后共享引用的问题——这两处错误往往不会立刻报错,而是让数据在某个深夜批量处理时悄悄错乱。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

6

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

60

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

148

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

273

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

113

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

159

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

30

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

81

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

62

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号