说说 java 中常见的集合类

简介: 本文介绍了Java集合框架的核心接口(Collection、List、Set、Map)及其常见实现类。图示展示了类间关系,重点解析ArrayList、LinkedList、HashSet、HashMap等实现原理与性能特点,并指出线程安全及进阶特性,助你掌握集合体系关键知识点。

重要的集合接口以及实现类参考下图

classDiagram

class Collection {<<interface>>}

class List {<<interface>>}

class Set {<<interface>>}

class Map {

<<interface>>

entrySet()*

keySet()*

values()*

}

Collection <|-- List

Collection <|-- Set

List <|.. ArrayList

List <|.. LinkedList

List <|.. Vector

Set <|.. HashSet

Map <|.. HashMap

Map <|.. TreeMap

Map <|.. Hashtable

Map <|.. ConcurrentHashMap

HashMap <|.. LinkedHashMap

Set <-- Map

Collection <-- Map

接口

  • 接口四个:Collection、List、Set、Map,它们的关系:
  • Collection 是父接口,List 和 Set 是它的子接口
  • Map 接口与其它接口的关系
  • Map 调用 entrySet(),keySet() 方法时,会创建 Set 的实现
  • Map 调用 values() 方法时,会用到 Collection 的实现

List 实现(常见三个)

  • ArrayList 基于数组实现
  • 随机访问(即根据索引访问)性能高
  • 增、删由于要移动数组元素,性能会受影响
  • 【进阶】但如果增、删操作的是数组尾部不牵涉移动元素
  • LinkedList 基于链表实现
  • 随机访问性能低,因为需要顺着链表一个个才能访问到某索引位置
  • 增、删性能高
  • 【进阶】说它随机访问性能低是相对的,如果是头尾节点,无论增删改查都快
  • 【进阶】说它增删性能高也是有前提的,并没有包含定位到该节点的时间,把这个算上,增删性能并不高
  • Vector 基于数组实现
  • 相对于前两种 List 实现是线程安全的
  • 【进阶】一些说法说 Vector 已经被舍弃,这是不正确的

Set 实现

  • HashSet 内部组合了 HashMap,利用 Map key 唯一的特点来实现 Set
  • 集合中元素唯一,注意需要为元素实现 hashCode 和 equals 方法
  • 【进阶】Set 的特性只有元素唯一,有些人说 Set 无序,这得看实现,例如 HashSet 无序,但TreeSet 有序

Map 实现(常见五个)

  • HashMap 底层是 Hash 表,即数组 + 链表,链表过长时会优化为红黑树
  • 集合中 Key 要唯一,并且它需要实现 hashCode 和 equals 方法
  • LinkedHashMap 基于 HashMap,只是在它基础上增加了一个链表来记录元素的插入顺序
  • 【进阶】这个链表,默认会记录元素插入顺序,这样可以以插入顺序遍历元素
  • 【进阶】这个链表,还可以按元素最近访问来调整顺序,这样可以用来做 LRU Cache 的数据结构
  • TreeMap 底层是红黑树
  • Hashtable 底层是 Hash 表,相对前面三个实现来说,线程安全
  • 【进阶】它的线程安全实现方式是在 put,get 等方法上都加了 synchronized,锁住整个对象
  • ConcurrentHashMap 底层也是 Hash 表,也是线程安全的
  • 【进阶】它的 put 方法执行时仅锁住一个链表,并发度比 Hashtable 高
  • 【进阶】它的 get 方法执行不加锁,是通过 volatile 保证数据的可见性

P.S.

  • 未标注的是必须记住的部分
  • 标注【进阶】的条目是该集合比较有特色的地方,回答出来就是加分项,不过也根据自己情况来记忆
相关文章
|
7月前
|
关系型数据库 MySQL Java
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
MySQL 分库分表 + 平滑扩容方案 (秒懂+史上最全)
|
9月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1252 0
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
424 14
|
7月前
|
算法 安全 网络安全
git clone操作报错diffie-hellman-group1-sha1的解决方案
在处理这一问题时,需要确保了解相关操作的安全影响。`diffie-hellman-group1-sha1`算法被认为是不够安全的,这是因为随着计算能力的提高,`SHA-1`算法可以在合理的时间内被破解,而且其对应的 `1024位`Diffie-Hellman组也可能不够强大。因此,在确保Git操作的同时,也要考虑提升安全性的长期解决办法。强烈推荐与管理员或相关技术支持团队合作,升级和加强服务器端的安全配置。
182 12
|
消息中间件 存储 NoSQL
解决MQ下单消息重复消费幂等机制详解
【11月更文挑战第20天】在分布式系统中,消息队列(Message Queue, MQ)作为一种常用的中间件,用于在不同系统或服务之间异步传输消息。MQ的应用场景广泛,如订单处理、日志收集、系统解耦等。然而,MQ的使用也伴随着一些挑战,其中消息重复消费是一个常见问题。特别是在下单场景中,如果消息被重复消费,可能会导致订单被重复创建或处理,从而引发一系列业务问题。
917 6
|
安全 Java 编译器
Java一分钟之——泛型方法与泛型接口
【5月更文挑战第20天】Java泛型提供编译时类型安全检查,提升代码重用和灵活性。本文探讨泛型方法和接口的核心概念、常见问题和避免策略。泛型方法允许处理多种数据类型,而泛型接口需在实现时指定具体类型。注意类型擦除、误用原始类型和泛型边界的理解。通过明确指定类型参数、利用通配符和理解类型擦除来避免问题。泛型接口要精确指定类型参数,适度约束,利用默认方法。示例代码展示了泛型方法和接口的使用。
308 1
Java一分钟之——泛型方法与泛型接口
|
Java
什么是java回调函数
什么是java回调函数
622 1
什么是java回调函数
|
Java 编译器 Spring
面试突击78:@Autowired 和 @Resource 有什么区别?
面试突击78:@Autowired 和 @Resource 有什么区别?
16924 6
|
XML Java 数据格式
【Spring】全面讲解IOC、AOP、注入方式、bean的生命周期、aop通知应用 spring与web容器整合
Spring是一个开源的轻量级Java应用开发框架,它提供了一种简单、高效、灵活的方式来构建企业级应用程序。Spring框架的核心特点是依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming),它通过一组模块化的组件提供全面的支持,使开发人员能够快速搭建可扩展、可维护的应用。
|
SQL Java 数据库连接
mybatis如何实现分页查询?
【10月更文挑战第19天】mybatis如何实现分页查询?
1294 3