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

集合类基础概念

目录

集合类概述

集合框架的体系结构

单列集合(Collection)

List接口

Set接口

双列集合(Map)

Map接口

线程安全与性能考虑

集合与数组的区别

大小是否固定

数据类型与存储

操作方法丰富性

内存与性能

类型安全与泛型支持

多态性和接口支持

选择集合适用的原则


集合类概述

集合(Collection)是用来存储、获取和操作一组对象的容器,是程序中非常重要的数据结构。Java 集合框架(Java Collections Framework, JCF)提供了一组接口和实现,方便开发者进行各种数据的存储操作

集合框架的体系结构

集合框架主要分为两大类:一类是单列集合父类接口为Collection,另一类是双列集合父类接口是Map

单列集合(Collection)

List接口

List是有序集合,允许元素重复,可以通过索引访问元素。

主要实现类:

  • Vector:基于数组实现,线程安全(方法同步),但性能较低

  • ArrayList:基于动态数组实现,非线程安全,随机访问快,增删慢

  • LinkedList:基于双向链表实现,非线程安全,增删快,随机访问慢

Set接口

Set不允许重复元素,通常用于去重场景。

主要实现类(图中有些Set实现类被错误地归类在List下):

  • HashSet:基于哈希表实现,无序

  • LinkedHashSet:基于哈希表和链表实现,维护插入顺序

  • TreeSet:基于红黑树实现,元素按自然顺序或Comparator排序

双列集合(Map)

Map接口

Map存储键值对(key-value)映射,key不可重复。

主要实现类:

  • HashTable:早期实现,线程安全(方法同步),不允许null键/值

  • HashMap:基于哈希表实现,非线程安全,允许null键/值

  • LinkedHashMap:维护插入顺序或访问顺序

  • ConcurrentHashMap:线程安全实现,比HashTable性能更好

  • TreeMap:基于红黑树实现,键按自然顺序或Comparator排序

线程安全与性能考虑

线程安全集合:Vector、HashTable、ConcurrentHashMap

非线程安全集合:ArrayList、LinkedList、HashMap等

性能优化

  • 频繁查询用ArrayList

  • 频繁增删用LinkedList

  • 需要排序用TreeSet/TreeMap

  • 需要保持插入顺序用LinkedHashSet/LinkedHashMap

  • 多线程环境用ConcurrentHashMap替代HashTable

集合与数组的区别

大小是否固定

数组(Array)

  • 创建时需要指定固定的大小,长度一旦确定,就不可更改。

  • 如果需要改变容量,只能创建新的数组,拷贝原数组数据,比较麻烦且低效。

  • 适合已知数据量且大小固定的场景。

集合(Collection)

  • 大小是动态可变的,可以随时添加或删除元素,容量自动扩展或收缩。

  • ArrayList 为例,底层使用动态数组实现,容量不足时会自动扩容。

  • 适合数据量不确定或需要频繁增删改的场景。


数据类型与存储

数组

  • 可以存储基本类型(如int[], char[])或对象类型(如String[])。

  • 基本类型数组性能高,因为直接存储数据。

  • 对象数组存储的是对象引用。

集合

  • 只能存储对象类型(引用类型),不能存储基本类型,需用包装类(如Integer代替int)。

  • 支持泛型(Generics),可以指定存储对象的类型,提高代码安全性和可读性。

  • 泛型是编译时类型检查,避免了强制类型转换的麻烦。


操作方法丰富性

数组

  • 操作较为基础,只能通过索引访问元素,增删操作需手动处理(如复制和移动元素)。

  • Java标准库提供了Arrays工具类支持排序、搜索、填充等静态方法,但使用不如集合方便。

集合

提供了丰富的操作接口,如:

  • 添加元素add(E e)

  • 删除元素remove(Object o)removeIf(Predicate<? super E> filter)

  • 查找元素contains(Object o)indexOf(Object o)

  • 遍历:支持迭代器(Iterator)、增强for循环

  • 排序:如Collections.sort(),或者流式操作(Stream API)

  • 批量操作addAll(), removeAll(), retainAll()

使用方便,代码简洁,功能强大。


内存与性能

数组

  • 内存连续分配,访问速度快,尤其是基本类型数组。

  • 对于大量数据和性能敏感场景,数组效率更高。

集合

  • 实现一般基于数组或链表,可能有额外的内存开销。

  • 动态扩容和复杂操作可能影响性能,但带来了灵活性。

  • 不同集合实现有不同性能特点(如ArrayList随机访问快,LinkedList插入删除快)。


类型安全与泛型支持

数组

  • 支持存储具体类型,编译时进行类型检查。

  • 但数组不支持泛型,不能创建泛型数组(new T[]非法)。

  • 数组存在类型协变(covariant),可能导致运行时异常(ArrayStoreException)。

集合

  • 支持泛型,提供编译时类型安全。

  • 避免了运行时的类型转换异常,代码更安全。


多态性和接口支持

数组

  • 是语言内置的基本结构,不支持接口或多态。

  • 不能直接用于面向接口编程。

集合

  • 集合是接口和实现类的体系,支持多态。

  • 可以灵活切换不同实现,比如从ArrayList切换为LinkedList,不影响业务代码。

选择集合适用的原则

  • 需要有序ListLinkedHashSet

  • 需要无重复元素Set

  • 需要键值对存储Map

  • 需要频繁随机访问ArrayList

  • 需要频繁插入删除LinkedList

  • 需要线程安全VectorHashtable、或并发集合类如 ConcurrentHashMap

http://www.lqws.cn/news/105607.html

相关文章:

  • 2023年12月四级真题作文的分析总结
  • 704. 二分查找 (力扣)
  • 十五、【测试执行篇】异步与并发:使用 Celery 实现测试任务的后台执行与结果回调
  • GaLore:基于梯度低秩投影的大语言模型高效训练方法详解一
  • JSCH使用SFTP详细教程
  • Hadoop复习(九)
  • Linux 与 Windows:哪个操作系统适合你?
  • javascript 实战案例 二级联动下拉选框
  • godwork_ AT 5.2 摄影测量空三数据处理软件。
  • 星敏感器:卫星姿态测量的“星空导航仪”
  • 关系型数据库通过sql语句实现悲观锁与乐观锁
  • Golang 依赖注入:构建松耦合架构的关键技术
  • 原始数据去哪找?分享15个免费官方网站
  • 用AI(Deepseek)做了配色网站-功能介绍【欢迎体验】
  • 力扣HOT100之多维动态规划:1143. 最长公共子序列
  • 52. N 皇后 II【 力扣(LeetCode) 】
  • Leetcode - 周赛 452
  • 动态规划-647.回文子串-力扣(LeetCode)
  • LeetCode 152. 乘积最大子数组 - 动态规划解法详解
  • 代码随想录60期day56
  • Android Kotlin 算法详解:链表相关
  • SpringBoot核心注解详解及3.0与2.0版本深度对比
  • java复习 02
  • 2.3 关于async/await的原理介绍
  • IBM DB2分布式数据库架构
  • Baklib内容中台AI重构智能服务
  • 秋招准备-数据结构
  • Java-IO流之字节输入流详解
  • MFC Resource.h 文件详解与修改指南
  • 网络安全-等级保护(等保)3-0 等级保护测评要求现行技术标准