java——集合框架

2023-11-16

在这里插入图片描述

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

接口

是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象

下面是 Java 集合框架中所有的集合接口及其对应的特点,以表格形式展示:

接口 描述
Collection 最基本的集合接口,一个 Collection 代表一组 Object
List 有序的 Collection,使用此接口能够精确的控制每个元素插入的位置
Set 不保存重复的元素
SortedSet 继承于 Set,保存有序的集合
Map 存储一组键值对,提供 key 到 value 的映射
Map.Entry 描述在一个 Map 中的一个元素(键/值对),是一个 Map 的内部接口
SortedMap 继承于 Map,使 Key 保持在升序排列
Enumeration 这是一个传统的接口和定义的方法,已被迭代器所取代

以上是 Java 集合框架中所有的集合接口及其对应的特点。在实际开发中,可以根据需求选择适合的集合类型来存储和处理数据。

实现(类)

是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。

下面是 Java 集合框架中常用的一些集合实现类及其对应的特点,以表格形式展示:

实现类 描述
AbstractCollection 实现了大部分的集合接口
AbstractList 继承于 AbstractCollection 并且实现了大部分 List 接口
AbstractSequentialList 继承于 AbstractList,提供了对数据元素的链式访问而不是随机访问
LinkedList 实现了 List 接口,允许有 null 元素,主要用于创建链表数据结构
ArrayList 实现了 List 接口,实现了可变大小的数组,提供更好的性能
AbstractSet 继承于 AbstractCollection 并且实现了大部分 Set 接口
HashSet 实现了 Set 接口,不允许出现重复元素,不保证集合中元素的顺序
LinkedHashSet 具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现
TreeSet 实现了 Set 接口,可以实现排序等功能
AbstractMap 实现了大部分的 Map 接口
HashMap 散列表存储键值对映射,根据键的 hashCode 值存储数据,具有快速的访问速度
TreeMap 继承于 AbstractMap,并使用一颗树实现,支持自动排序
WeakHashMap 继承于 AbstractMap 类,使用弱密钥的哈希表
LinkedHashMap 继承于 HashMap,使用元素的自然顺序对元素进行排序
IdentityHashMap 继承于 AbstractMap 类,比较文档时使用引用相等
Vector 与 ArrayList 相似,但是是同步的,可以用在多线程的情况
Stack 是 Vector 的子类,实现了一个标准的后进先出的栈
Dictionary 是一个抽象类,用来存储键/值对,作用和 Map 类相似
Hashtable 是 Dictionary 类的子类,位于 java.util 包中
Properties 继承于 Hashtable,表示一个持久的属性集,属性列表中每个键及其对应值都是一个字符串
BitSet 创建一种特殊类型的数组来保存位值

以上是 Java 集合框架中常用的一些集合实现类及其对应的特点。在实际开发中,可以根据需求选择适合的实现类来存储和处理数据。

算法

是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序,这些算法实现了多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
好的,下面将结合代码详细介绍 Java 集合算法的使用:

1. 排序算法

Java 集合框架中提供了两种排序算法:归并排序和快速排序。其中,Collections.sort() 方法和 Arrays.sort() 方法都已经进行了封装,可以直接使用。

归并排序示例代码:

List<Integer> list = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);
Collections.sort(list);
System.out.println(list);

以上代码中,我们创建了一个 Integer 类型的 List 集合,并将一些数字添加到其中。然后,我们调用了 Collections.sort() 方法对其进行排序,并输出排序后的结果。

快速排序示例代码:

int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));

以上代码中,我们创建了一个 int 类型的数组,并将一些数字添加到其中。然后,我们调用了 Arrays.sort() 方法对其进行排序,并输出排序后的结果。

2. 查找算法

Java 集合框架中提供了二分查找和线性查找两种查找算法。

二分查找示例代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int index = Collections.binarySearch(list, 4);
System.out.println(index);

以上代码中,我们创建了一个 Integer 类型的 List 集合,并将一些数字添加到其中。然后,我们调用了 Collections.binarySearch() 方法进行二分查找,并输出查找结果。

线性查找示例代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int index = -1;
for (int i = 0; i < list.size(); i++) {
    if (list.get(i) == 4) {
        index = i;
        break;
    }
}
System.out.println(index);

以上代码中,我们创建了一个 Integer 类型的 List 集合,并将一些数字添加到其中。然后,我们使用 for 循环遍历集合,并进行线性查找,并输出查找结果。

3. 拷贝算法

Java 集合框架中提供了 Collections.copy() 方法和 System.arraycopy() 方法用于拷贝。

Collections.copy() 示例代码:

List<Integer> source = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> target = new ArrayList<>(source.size());
target.addAll(source);
Collections.copy(target, source);
System.out.println(target);

以上代码中,我们创建了一个 Integer 类型的 List 集合 source,并将一些数字添加到其中。然后,我们创建了一个空的 ArrayList 类型的 target 集合,并用 addAll() 方法将 source 集合的元素全部添加到 target 集合中。最后,我们使用 Collections.copy() 方法将 source 集合的元素拷贝到 target 集合中,并输出结果。

System.arraycopy() 示例代码:

int[] source = {1, 2, 3, 4, 5};
int[] target = new int[source.length];
System.arraycopy(source, 0, target, 0, source.length);
System.out.println(Arrays.toString(target));

以上代码中,我们创建了一个 int 类型的数组 source,并将一些数字添加到其中。然后,我们创建了一个空的 int 类型的数组 target,并使用 System.arraycopy() 方法将 source 数组的元素全部拷贝到 target 数组中,并输出结果。

4. 填充算法

Java 集合框架中提供了 Collections.fill() 方法和 Arrays.fill() 方法用于填充。

Collections.fill() 示例代码:

List<Integer> list = Arrays.asList
Integer[] arr = new Integer[5];
Collections.fill(Arrays.asList(arr), 0);
System.out.println(Arrays.toString(arr));

以上代码中,我们创建了一个长度为 5 的 Integer 类型的数组 arr,并使用 Arrays.asList() 将其转换为 List 集合。然后,我们使用 Collections.fill() 方法将该集合中所有元素都设置为 0,并输出结果。

Arrays.fill() 示例代码:

int[] arr = new int[5];
Arrays.fill(arr, 0);
System.out.println(Arrays.toString(arr));

以上代码中,我们创建了一个长度为 5 的 int 类型的数组 arr,并使用 Arrays.fill() 方法将其所有元素都设置为 0,并输出结果。

5. 比较算法

Java 集合框架中提供了 Collections.max()Collections.min() 方法用于比较。

示例代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int max = Collections.max(list);
int min = Collections.min(list);
System.out.println("最大值:" + max);
System.out.println("最小值:" + min);

以上代码中,我们创建了一个 Integer 类型的 List 集合,并将一些数字添加到其中。然后,我们使用 Collections.max() 方法和 Collections.min() 方法找出该集合中的最大值和最小值,并输出结果。

6. 随机算法

Java 集合框架中提供了 Collections.shuffle() 方法用于随机操作。

示例代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Collections.shuffle(list);
System.out.println(list);

以上代码中,我们创建了一个 Integer 类型的 List 集合,并将一些数字添加到其中。然后,我们使用 Collections.shuffle() 方法对该集合进行随机排序,并输出结果。

7. 迭代器算法

Java 集合框架中提供了 Iterator 接口和 ListIterator 接口用于迭代操作。

示例代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

ListIterator<Integer> listIterator = list.listIterator();
while (listIterator.hasNext()) {
    System.out.println(listIterator.next());
}

以上代码中,我们创建了一个 Integer 类型的 List 集合,并将一些数字添加到其中。然后,我们使用 iterator() 方法获取列表的迭代器对象,并使用 hasNext()next() 方法对其进行遍历。接着,我们使用 listIterator() 方法获取列表的列表迭代器对象,并使用 hasNext()next()hasPrevious()previous() 等方法对其进行遍历。

除了以上介绍的常见集合算法,Java 集合框架中还提供了其他一些算法,下面也简单介绍一下:

8. 交集、并集、差集

Java 集合框架中提供了 retainAll() 方法和 removeAll() 方法分别用于求两个集合的交集和差集。

示例代码:

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(3, 4, 5, 6, 7);
// 求交集
list1.retainAll(list2);
System.out.println(list1);
// 求差集
list1 = Arrays.asList(1, 2, 3, 4, 5);
list2 = Arrays.asList(3, 4, 5, 6, 7);
list1.removeAll(list2);
System.out.println(list1);

以上代码中,我们创建了两个 Integer 类型的 List 集合 list1 和 list2,并将一些数字添加到其中。然后,我们使用 retainAll() 方法对 list1 集合和 list2 集合进行求交集操作,并输出结果;接着,我们使用 removeAll() 方法对 list1 集合和 list2 集合进行求差集操作,并输出结果。

9. 分割集合

Java 集合框架中提供了 subList() 方法用于分割集合。

示例代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> subList = list.subList(1, 4);
System.out.println(subList);

以上代码中,我们创建了一个 Integer 类型的 List 集合,并将一些数字添加到其中。然后,我们使用 subList() 方法获取该集合的子集合,从下标 1 开始,到下标 4 前一个元素为止(即下标 1、2、3 的元素),并输出结果。

10. 数组和集合的互转

Java 集合框架中提供了 Arrays.asList() 方法和 Collection.toArray() 方法用于数组和集合之间的转换。

示例代码:

Integer[] arr = {1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);
System.out.println(list);

list = Arrays.asList(6, 7, 8, 9, 10);
arr = list.toArray(new Integer[list.size()]);
System.out.println(Arrays.toString(arr));

以上代码中,我们创建了一个 Integer 类型的数组 arr,并将一些数字添加到其中。然后,我们使用 Arrays.asList() 方法将该数组转换为 List 集合,并输出结果;接着,我们将另一个 List 集合转换为 Integer 类型的数组,并输出结果。

这些算法是 Java 集合框架中常见的算法,可以帮助我们进行更加高效、便捷的集合操作和处理。在实际开发过程中,我们可以根据具体需求选择合适的算法来实现需要的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java——集合框架 的相关文章

  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 带 getClassLoader 和不带 getClassLoader 的 getResourceAsStream 有什么区别?

    我想知道以下两者之间的区别 MyClass class getClassLoader getResourceAsStream path to my properties and MyClass class getResourceAsStre
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve

随机推荐

  • Allure在自动化测试中的应用!

    01 Allure的简介及使用 1 应用场景 自动化的结果一定是通过一个报告来进行体现 Allure 是一个独立的报告插件 生成美观易读的报告 目前支持Python Java PHP C 等语言 为dev QA 提供详尽的测试报告 测试步骤
  • 微信小程序实现视频号跳转

    三种类型 1 跳转到视频号主页 wx openChannelsUserProfile finderUserName 视频号id 2 跳转到视频号视频 wx openChannelsActivity feedId 视频id finderUse
  • 文件上传-图片webshell上传

    图片webshell制作 在服务器端的PHP代码中 对于用户上传的文件做文件类型检查 查看文件格式是否符合上传规范 可以检查文件二进制格式的前几个字节 从而判断文件类型是否正确 针对这种情况可以直接新建要给1 jpg 其中代码内容如下 GI
  • 【数据结构】 二叉树面试题讲解->壹

    文章目录 引言 相同的树 https leetcode cn problems same tree description 题目描述 示例 示例一 示例二 示例三 题目解析 代码实现 另一棵树的子树 https leetcode cn pr
  • 华为OD机试-找出重复代码-2022Q4 A卷-Py/Java/JS

    小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码中的最长公
  • 深度学习之感知器的python实现,及用感知器实现鸢尾花的分类

    机器学习一般用来处理结构化的数据 深度学习一般用来处理非结构化的数据 例如图像 视频 文字等 权重更新过程 如果真实是1 预测是0 则权重会增加 相当于为了达到阈值增加权重 如果真实是0 预测是1 则权重会降低 相当于为了达到阈值减少权重
  • 玩客云通过openwrt作为旁路由

    前置条件 玩客云安装 docker 安装 OpenWrt 这边又两套方案可供选择 下面是具体教程的链接镜像一 https www right com cn forum thread 8024126 1 1 html镜像二 https hub
  • 在Idea中调试ant应用

    Ant调试 Ant调试 ant 是一种非常方便的打包 部署的工具 通过ant 可以一键构建整个项目 虽然MVN也支持这种功能 但是MVN混杂了package管理的功能 并且不是很自由 学习成本比较高 通常 我们调试ant构成的程序 是通过远
  • 零散算法

    1 字符串匹配 朴素的串匹配算法 KMP匹配算法 2 广度优先搜索BFS 3 深度优先搜索DFS 4 狄克斯特拉算法Dijkstra 5 贪婪算法 6 动态规划 7 安全散列算法SHA 用递归分析问题 基于循环写代码 10 关于查找算法 1
  • unity+射线检测

    private Camera aRCamera Ray ray RaycastHit hit aRCamera GameObject Find RenderCamera GetComponent
  • JavaScript节流与防抖

    一 节流 概念 在规定的间隔时间范围内不会重复触发回调 只有大于这个时间间隔才会触发回调 把频繁触发变为少量触发 类似于技能CD 应用 点击按钮 轮播图点击左右箭头 插件lodash js 它里面封装了函数的防抖与节流业务 p 计数器 sp
  • 抓包工具篇|Charles

    1 简介 Charles 是在 Mac 下常用的网络封包截取工具 在做 移动开发时 我们为了调试与服务器端的网络通讯协议 常常需要截取网络封包来分析 Charles 是收费软件 可以免费试用 30 天 试用期过后 未付费的用户仍然可以继续使
  • 怎样使用BAT脚本实现自动按键盘的某个键

    批处理是不行的 用VBS 很简单 例子如下 Set objShell CreateObject Wscript Shell do WScript Sleep 3000 objShell SendKeys F5 WScript Sleep 3
  • Weblogic 12c 集群部署和session复制

    在上一篇Weblogic12c集群搭建的基础上 这一篇介绍Weblogic12c集群应用的部署和session复制 1 启动服务 首先在weblogic12c控制台 启动受托管服务server1 server2 server3 2 将要部署
  • 前端实现微信支付(H5,微信小程序)

    一 微信支付 H5 微信小程序 通常一些电商项目使用到微信支付操作 所以简单地介绍一下微信支付的具体流程 1 1 什么是微信支付 在什么业务场景会使用到微信支付 微信支付是微信内置微信浏览器 其他浏览器不支持 或者微信小程序的支付接口 主要
  • ubuntu如何修改首次登入不是anaconda的base环境

    ubuntu安装anaconda后 每次用户登录进去后所在环境都是anaconda的base虚拟环境 如果用户不想一开始登进去就是anaconda的base环境 想在需要使用anaconda时再激活anaconda环境 输入下面的命令就可以
  • 在Flutter里面构建布局

    https flutter io tutorials layout 可以学到 Flutter的布局机制 如何水平与垂直布局控件 如何构建一个Flutter布局 布局的效果图 https flutter io tutorials layout
  • 西山小菜鸟之Scrapy学习笔记---splash简介

    前言 本文主要介绍scrapy splash的理论知识 文中如有不正确的地方望大家指正 本文的主要内容出自书 精通Scrapy网络爬虫 虫术 Python绝技 背景 近几年随着前端技术和手机端App的飞速发展 互联网架构也发生了巨大的变化
  • 经典兔子问题python(头歌教学实践平台)

    第1关 经典兔子问题 递归 任务描述 问题 有一对兔子 从出生后的第三个月起 每个月都生一对兔子 小兔子再长三个月后每个月又生一对兔子 假如兔子都不死 请问每个月的兔子的数量是多少对 本关任务 编写程序求解上面的问题 相关知识 兔子问题的分
  • java——集合框架

    文章目录 接口 实现 类 算法 1 排序算法 2 查找算法 3 拷贝算法 4 填充算法 5 比较算法 6 随机算法 7 迭代器算法 8 交集 并集 差集 9 分割集合 10 数组和集合的互转 集合框架是一个用来代表和操纵集合的统一架构 所有