Java 教程
- Java - 首页
- Java - 概述
- Java - 历史
- Java - 特性
- Java 与 C++
- JVM - Java虚拟机
- Java - JDK、JRE 与 JVM 的区别
- Java - Hello World 程序
- Java - 环境搭建
- Java - 基本语法
- Java - 变量类型
- Java - 数据类型
- Java - 类型转换
- Java - Unicode 系统
- Java - 基本运算符
- Java - 注释
- Java - 用户输入
- Java - 日期与时间
Java 控制语句
- Java - 循环控制
- Java - 决策制定
- Java - if-else 语句
- Java - switch 语句
- Java - for 循环
- Java - 增强 for 循环
- Java - while 循环
- Java - do-while 循环
- Java - break 语句
- Java - continue 语句
面向对象编程
- Java - 面向对象编程概念
- Java - 对象与类
- Java - 类属性
- Java - 类方法
- Java - 方法
- Java - 变量作用域
- Java - 构造函数
- Java - 访问修饰符
- Java - 继承
- Java - 聚合
- Java - 多态
- Java - 方法重写
- Java - 方法重载
- Java - 动态绑定
- Java - 静态绑定
- Java - 实例初始化块
- Java - 抽象
- Java - 封装
- Java - 接口
- Java - 包
- Java - 内部类
- Java - 静态类
- Java - 匿名类
- Java - 单例类
- Java - 包装类
- Java - 枚举
- Java - 枚举构造函数
- Java - 枚举字符串
Java 内置类
Java 文件处理
Java 错误与异常
- Java - 异常
- Java - try-catch 块
- Java - try-with-resources 语句
- Java - 多重 catch 块
- Java - 嵌套 try 块
- Java - finally 块
- Java - throw 异常
- Java - 异常传播
- Java - 内置异常
- Java - 自定义异常
Java 多线程
- Java - 多线程
- Java - 线程生命周期
- Java - 创建线程
- Java - 启动线程
- Java - 线程连接
- Java - 线程命名
- Java - 线程调度器
- Java - 线程池
- Java - 主线程
- Java - 线程优先级
- Java - 守护线程
- Java - 线程组
- Java - 关闭钩子
Java 同步
Java 网络编程
- Java - 网络编程
- Java - 套接字编程
- Java - URL 处理
- Java - URL 类
- Java - URLConnection 类
- Java - HttpURLConnection 类
- Java - Socket 类
- Java -泛型
Java 集合
Java 接口
Java 数据结构
Java 集合算法
高级 Java
- Java - 命令行参数
- Java - Lambda 表达式
- Java - 发送邮件
- Java - Applet 基础
- Java - Javadoc 注释
- Java - 自动装箱和拆箱
- Java - 文件不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 文件
- Java - 私有接口方法
- Java - 内部类菱形运算符
- Java - 多分辨率图像 API
- Java - 集合工厂方法
- Java - 模块系统
- Java - Nashorn JavaScript
- Java - Optional 类
- Java - 方法引用
- Java - 函数式接口
- Java - 默认方法
- Java - Base64 编码解码
- Java - switch 表达式
- Java - Teeing 收集器
- Java - 微基准测试
- Java - 文本块
- Java - 动态 CDS 归档
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指针异常
- Java - 打包工具
- Java - 密封类
- Java - 记录类
- Java - 隐藏类
- Java - 模式匹配
- Java - 简洁数字格式化
- Java - 垃圾回收
- Java - JIT 编译器
Java 杂项
- Java - 递归
- Java - 正则表达式
- Java - 序列化
- Java - 字符串
- Java - Process API改进
- Java - Stream API改进
- Java - 增强@Deprecated注解
- Java - CompletableFuture API改进
- Java - 流
- Java - 日期时间API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java APIs与框架
Java 类引用
- Java - Scanner 类
- Java - 数组
- Java - 字符串
- Java - Date 类
- Java - ArrayList 类
- Java - Vector 类
- Java - Stack 类
- Java - PriorityQueue 类
- Java - LinkedList 类
- Java - ArrayDeque 类
- Java - HashMap 类
- Java - LinkedHashMap 类
- Java - WeakHashMap 类
- Java - EnumMap 类
- Java - TreeMap 类
- Java - IdentityHashMap 类
- Java - HashSet 类
- Java - EnumSet 类
- Java - LinkedHashSet 类
- Java - TreeSet 类
- Java - BitSet 类
- Java - Dictionary 类
- Java - Hashtable 类
- Java - Properties 类
- Java - Collection 类
- Java - Array 类
Java 有用资源
Java集合框架
在 Java 2 之前,Java 提供了临时类,例如Dictionary、Vector、Stack 和 Properties 来存储和操作对象组。虽然这些类非常有用,但它们缺乏一个核心统一的主题。因此,使用 Vector 的方式与使用 Properties 的方式不同。
为什么需要集合框架?
集合框架的设计是为了满足几个目标,例如:
该框架必须具有高性能。基本集合(动态数组、链表、树和哈希表)的实现必须高效。
该框架必须允许不同类型的集合以类似的方式工作,并具有高度的互操作性。
该框架必须能够轻松扩展和/或适配集合。
为此,整个集合框架都是围绕一组标准接口设计的。提供了几个这些接口的标准实现,例如LinkedList、HashSet 和 TreeSet,您可以按原样使用它们,也可以根据需要实现您自己的集合。
Java 集合框架
集合框架是表示和操作集合的统一架构。所有集合框架都包含以下内容:
实现,即 类 − 这些是集合接口的具体实现。从本质上讲,它们是可重用的数据结构。
算法 − 这些是在实现集合接口的对象上执行有用计算(例如搜索和排序)的方法。据说算法是多态的:即,相同的方法可以用于许多不同实现的适当集合接口。
除了集合之外,框架还定义了几个映射接口和类。映射存储键/值对。虽然映射并非集合(按术语的正确用法),但它们与集合完全集成。
集合框架的层次结构
集合框架的所有类和接口都可以在java.util 包中找到。下图显示了 Java 中集合框架的层次结构。(此处应插入图表)
Java 集合接口
集合框架定义了几个接口。本节概述每个接口:
序号 | 接口与描述 |
---|---|
1 | Collection 接口
这使您可以使用对象组;它是集合层次结构的顶层。 |
2 | List 接口
这扩展了Collection,List 的实例存储元素的有序集合。 |
3 | Set 接口
这扩展了 Collection 来处理集合,集合必须包含唯一元素。 |
4 | SortedSet 接口
这扩展了 Set 来处理排序集合。 |
5 | Map 接口
这将唯一键映射到值。 |
6 | Map.Entry 接口
这描述了映射中的元素(键/值对)。这是 Map 的内部类。 |
7 | SortedMap 接口
这扩展了 Map,以便键按升序维护。 |
8 | Enumeration 接口
这个遗留接口定义了您可以枚举(一次获取一个)对象集合中的元素的方法。这个遗留接口已被 Iterator 取代。 |
Java 集合类
Java 提供了一组实现 Collection 接口的标准集合类。一些类提供了完整的实现,可以按原样使用,而另一些是抽象类,提供骨架实现,用作创建具体集合的起点。
标准集合类总结在下表中:
序号 | 类与描述 |
---|---|
1 | AbstractCollection 类 实现了大部分 Collection 接口。 |
2 | AbstractList 类 扩展 AbstractCollection 并实现 List 接口的大部分功能。 |
3 | AbstractSequentialList 扩展 AbstractList,供使用顺序访问(而非随机访问)元素的集合使用。 |
4 | LinkedList
通过扩展 AbstractSequentialList 实现链表。 |
5 | ArrayList
通过扩展 AbstractList 实现动态数组。 |
6 | AbstractSet 扩展 AbstractCollection 并实现 Set 接口的大部分功能。 |
7 | HashSet
扩展 AbstractSet,用于哈希表。 |
8 | LinkedHashSet
扩展 HashSet,允许按插入顺序迭代。 |
9 | TreeSet
实现存储在树中的集合。扩展 AbstractSet。 |
10 | AbstractMap 实现 Map 接口的大部分功能。 |
11 | HashMap
扩展 AbstractMap,使用哈希表。 |
12 | TreeMap
扩展 AbstractMap,使用树。 |
13 | WeakHashMap
扩展 AbstractMap,使用具有弱键的哈希表。 |
14 | LinkedHashMap
扩展 HashMap,允许按插入顺序迭代。 |
15 | IdentityHashMap
扩展 AbstractMap,在比较文档时使用引用相等性。 |
AbstractCollection、AbstractSet、AbstractList、AbstractSequentialList 和 AbstractMap 类提供了核心集合接口的骨架实现,以最大限度地减少实现它们所需的努力。
前面章节讨论了 java.util 定义的以下遗留类:
序号 | 类与描述 |
---|---|
1 | Vector
实现动态数组。它类似于 ArrayList,但有一些区别。 |
2 | Stack
Stack 是 Vector 的子类,实现标准的后进先出 (LIFO) 栈。 |
3 | Dictionary
Dictionary 是一个抽象类,表示键值存储库,其功能与 Map 非常相似。 |
4 | Hashtable
Hashtable 是最初的 java.util 的一部分,是 Dictionary 的具体实现。 |
5 | Properties
Properties 是 Hashtable 的子类。它用于维护值列表,其中键是字符串,值也是字符串。 |
6 | PriorityQueue
PriorityQueue 类是基于优先级堆的无界优先级队列。依赖自然排序的优先级队列也不允许插入不可比较的对象。 |
7 | BitSet
BitSet 类创建一个特殊类型的数组,用于保存位值。此数组可以根据需要增加大小。 |
8 | ArrayDeque
ArrayDeque 类提供可调整大小的数组并实现 Deque 接口。数组双端队列没有容量限制,因此它们会根据需要增长以支持使用。 |
9 | EnumMap
EnumMap 类是一个专门的 Map 实现,用于枚举键。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。 |
10 | Queue
Queue 接口在 java.util 包中提供,它实现 Collection 接口。Queue 实现 FIFO(先进先出)。这意味着先输入的元素是先删除的元素。 |
11 | Deque
EnumMap 类是一个专门的 Map 实现,用于枚举键。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。 |
集合算法
集合框架定义了几种可应用于集合和映射的算法。这些算法在 Collections 类中定义为静态方法。
一些方法可能会抛出 **ClassCastException**(当尝试比较不相容的类型时发生)或 **UnsupportedOperationException**(当尝试修改不可修改的集合时发生)。
Collections 定义三个静态变量:EMPTY_SET、EMPTY_LIST 和 EMPTY_MAP。所有这些都是不可变的。
序号 | 算法和描述 |
---|---|
1 | 集合算法
这是一个所有算法实现的列表。 |
如何使用迭代器?
通常,您需要遍历集合中的元素。例如,您可能需要显示每个元素。
最简单的方法是使用迭代器,它是一个实现 Iterator 或 ListIterator 接口的对象。
迭代器使您可以遍历集合,获取或删除元素。ListIterator 扩展 Iterator 以允许双向遍历列表和修改元素。
序号 | 迭代器方法和描述 |
---|---|
1 | 使用 Java 迭代器
这是一个 Iterator 和 ListIterator 接口提供的所有方法的列表,并附带示例。 |
如何使用比较器?
TreeSet 和 TreeMap 都按排序顺序存储元素。但是,正是比较器定义了“排序顺序”的确切含义。
此接口允许我们以多种不同的方式对给定的集合进行排序。此外,此接口还可用于对任何类的任何实例进行排序(即使是我们无法修改的类)。
序号 | 迭代器方法和描述 |
---|---|
1 | 使用 Java 比较器
这是一个 Comparator 接口提供的所有方法的列表,并附带示例。 |
如何使用可比较对象?
TreeSet 和 TreeMap 都按排序顺序存储元素。我们可以使用 Comparable 接口来精确定义“排序顺序”的含义。
此接口允许我们以多种不同的方式对给定的集合进行排序。此外,此接口还可用于对任何类的任何实例进行排序(即使是我们无法修改的类)。
序号 | 迭代器方法和描述 |
---|---|
1 | 使用 Java Comparable
这是一个 Comparable 接口提供的所有方法的列表,并附带示例。 |
总结
Java 集合框架使程序员可以访问预打包的数据结构以及用于操作它们的方法。
集合是一个可以保存对其他对象的引用的对象。集合接口声明可以对每种类型的集合执行的操作。
集合框架的类和接口位于 java.util 包中。