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

集合类基础概念

目录

集合类概述

集合框架的体系结构

单列集合(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.xdnf.cn/news/10926.html

相关文章:

  • SMART原则讲解
  • centos挂载目录满但实际未满引发系统宕机
  • leetcode491.递增子序列:HashSet同层去重与递增条件的双重保障
  • 【python】三元图绘制(详细注释)
  • 春秋云镜 Certify Writeup
  • 光耦电路学习,光耦输入并联电阻、并联电容,光耦输出滤波电路
  • Vert.x学习笔记-Verticle原理解析
  • 一、类模板
  • ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
  • 【数据结构知识分享】顺序表详解
  • 《中国城市统计年鉴》面板数据(1985-2024)
  • 如何安装huaweicloud-sdk-core-3.1.142.jar到本地仓库?
  • 板凳-------Mysql cookbook学习 (九--3)
  • AtCoder Beginner Contest 408(ABCDE)
  • Ⅲ-2.计算机二级选择题(三大结构之选择结构)
  • BeeWorks:私有化即时通讯,筑牢企业信息安全防线
  • 运维视角下的广告系统之理解广告索引级联
  • python实现基于声音识别的腕带式打鼾干预装置设计与实现
  • browser-use Agent 日志链路分析
  • CET6 仔细阅读 24年12月第一套-C1 大脑这一块
  • 【开发心得】筑梦上海:项目风云录(18)
  • 金蝶云星空对接旺店通案例分享
  • 使用 Golang `testing/quick` 包进行高效随机测试的实战指南
  • 第五章 5.Subnetting (CCNA)
  • 基于c++面向对象的设计(下)
  • FreeRTOS,其基本概念、定义、性质、定理
  • 【运维】统信UOS操作系统aarch64自制OpenSSH 9.6p1 rpm包(含ssh-copy-id命令)修复漏洞
  • 构建检索增强生成(RAG)应用:第二部分
  • agent mode 代理模式,整体要求,系统要求, 系统指令
  • 多模态大语言模型arxiv论文略读(104)