当前位置: 首页 > news >正文

学习开发之数组和集合的相似与不同

在 Java 中,数组(Array)集合(Collection) 都是用于存储多个数据的容器结构。它们有一些相似之处,但也存在显著的区别,适用于不同的使用场景。


✅ 一、Java 数组与集合的相似点

相似点说明
存储多个元素都可以用来保存一组相同或不同类型的数据(集合支持泛型)
支持遍历都可以通过循环进行遍历访问每个元素
可以通过索引访问(部分集合)如 List 接口支持通过索引访问元素
都属于 Java 数据结构的一部分是 Java 程序中常用的数据存储方式

❌ 二、Java 数组与集合的不同点

区别点数组集合
类型原生语言结构类库(java.util 包)
大小固定性固定大小(初始化后不能改变)动态扩容(如 ArrayListHashMap 等)
元素类型只能是同一类型(基本类型或引用类型)可以是不同类型的对象(如果不用泛型)
支持操作操作较少(赋值、访问、遍历等)操作丰富(增删改查、排序、查找、去重等)
元素重复允许重复Set 不允许重复;List 允许重复
是否有序有序(按索引顺序)List 有序;Set 无序(除非用 LinkedHashSet
线程安全部分集合线程安全(如 VectorCollections.synchronizedList()
性能访问快(O(1))根据实现类不同性能也不同
泛型支持不支持支持泛型,提高了类型安全性
键值对不支持Map 支持键值对存储

🧪 三、代码示例对比:数组 vs 集合(List)

示例 1:创建和添加元素

// 数组
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;// List 集合
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

示例 2:动态扩容

// 数组不能扩容,只能重新创建一个更大的数组
int[] newArr = new int[arr.length + 1];
System.arraycopy(arr, 0, newArr, 0, arr.length);
newArr[arr.length] = 4;// 集合自动扩容
list.add(4); // 自动增长容量

示例 3:删除元素

// 数组不能直接删除,需要手动复制
int indexToRemove = 1;
for (int i = indexToRemove; i < newArr.length - 1; i++) {newArr[i] = newArr[i + 1];
}// 集合可以直接删除
list.remove(1); // 删除索引为1的元素

示例 4:遍历

// 数组遍历
for (int num : arr) {System.out.print(num + " ");
}
System.out.println();// 集合遍历
for (Integer num : list) {System.out.print(num + " ");
}
System.out.println();

📊 四、适用场景总结

使用场景推荐结构
元素个数固定且频繁访问数组
元素数量不确定、需频繁增删集合(如 ArrayList
去重需求Set
存储键值关系Map
高并发环境ConcurrentHashMapCopyOnWriteArrayList 等线程安全集合

🧠 小贴士

  • 如果你只需要快速访问和少量数据,推荐使用 数组
  • 如果你需要动态管理数据、丰富的操作方法,推荐使用 集合框架
  • 集合框架更强大、灵活,是现代 Java 开发的首选方式。
http://www.lryc.cn/news/579366.html

相关文章:

  • Boss:玩家摄像机系统
  • Python干涉仿真
  • 快速搭建大模型web对话环境指南(open-webUI)
  • 12. grafana-Dashboard的Variable(过滤)使用
  • vbox 虚拟共享文件夹 创建以及权限问题
  • 多模态AI Agent技术栈解析:视觉-语言-决策融合的算法原理与实践
  • [特殊字符] 从图片自动生成 Excel:Python 批量 OCR 表格识别实战
  • 高压电缆护层安全的智能防线:TLKS-PLGD 监控设备深度解析
  • Redis 消息的发布和订阅
  • C++11 shared_ptr 原理与详细教程
  • 算法分析的系统性总结
  • FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
  • Python 物联网(IoT)与边缘计算开发实战(1)
  • 基于多线程实现链表快排
  • 如何有效的开展接口自动化测试?
  • Linux之Socket 编程 UDP
  • C++ 项目实践:如何用对象池优化内存管理、解决 MISRA 报警
  • 制作一款打飞机游戏76:分数显示
  • CentOS系统高效部署fastGPT全攻略
  • Android音视频探索之旅 | CMake基础语法 创建支持Ffmpeg的Android项目
  • 电脑CPU使用率占用100%怎么办 解决步骤指南
  • 按键精灵 安卓脚本开发:游戏实战之自动切换账号辅助工具
  • 需要scl来指定编译器的clangd+cmake在vscode/cursor开发环境下的配置
  • reactnative页面适配UI设计尺寸px转dp的完美解决方案px2dp
  • 9.Docker的容器数据卷使用(挂载)
  • CAD2018,矩形设计,新增文字,块新增与打散
  • snail-job的oracle sql(oracle 11g)
  • OFD|WPS|PDF 文档在线预览-高级功能
  • 前置代理重构网络访问的「中转站」
  • AI大模型的技术演进、流程重构、行业影响三个维度的系统性分析