”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java集合框架

Java集合框架

发布于2024-09-14
浏览:992

问什么是 Java Collection Framework?

Ans Java Collection 框架是一个功能强大的内置库,提供了一组最常用数据结构和算法的优化实现。它广泛用于构建 Java 应用程序和解决实际软件开发问题挑战。


Java集合框架有何优势?

Ans Java Collection 框架的一些优点是

  1. 统一架构:每个数据结构都源自接口,例如可迭代接口和集合接口,提供通用实现的感觉。
  2. 易于使用:它通过提供预构建的数据结构和算法来简化开发过程。开发者可以更加专注于业务逻辑,而不是手动实现和优化常用的数据结构和标准算法。
  3. 灵活性:如果我们想改变底层数据结构,我们可以轻松地做到这一点,而不必担心改变数据结构会改变数据检索和访问模式(大部分)。
  4. 线程安全:由于java提供了一种在不同线程上单独运行进程的方法,Java Collection Framework提供了不同的类来在多线程环境和单线程应用程序中运行。

JAVA 集合框架层次结构

JAVA COLLECTION FRAMEWORK


可迭代接口
Java 中的 Iterable 接口是 Collection Framework 的关键组件。它是所有可迭代集合类型的根接口。实现 Iterable 接口允许对象成为“for-each 循环”(也称为增强 for 循环)的目标。
它还提供了一个迭代器对象,可用于实现此可迭代接口的所有数据结构的前向迭代。

使用 FOR EACH 循环的示例(增强型 FOR 循环)

ArrayList内部实现了List,List Interface扩展了Collection Interface,Collection Interface扩展了Iterable Interface。

List list = new ArrayList();//声明一个数据结构
list.add("Java");//添加元素
list.add("Collections");//添加元素
list.add("Framework");//添加元素
for (String element : list) {//使用增强的for循环进行迭代
System.out.println(element);
}

使用 ITERABLE 对象的示例

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
字符串元素 = iterator.next();
System.out.println(element);
}

因此,我们可以创建自定义可迭代,实现可迭代接口并重写 next、hasNext 和 remove 方法。这是相同的示例。

import java.util.Iterator;
class CustomIterable implements Iterable {
    private final int[] numbers = {1, 2, 3, 4, 5};

    @Override
    public Iterator iterator() {
        return new Iterator() {
            private int index = 0;
            private int lastReturnedIndex = -1;

            @Override
            public boolean hasNext() {
                return index 



笔记 :

  1. Java 中的迭代器是快速失败的。这意味着如果集合在迭代时被修改(除了通过迭代器自己的remove()方法),它会抛出ConcurrentModificationException。
  2. remove() 方法只能删除元素,并且每次调用 next() 时只能调用一次。否则,它将抛出 IllegalStateException。

采集接口

这是数据结构和内部实现变得灵活的接口。主要所有类都间接实现此接口,允许通过更改分配给它的 Collection 引用的对象来更改实现。

//ArrayList
Collection c = new ArrayList():
c.add(1);
c.add(2);
c.contains(1);

Collection c1 = new LinkedList():
c1.addAll(c);//Array added to a linked list

/*What if i dont want arraylist but now i want a priority queue for applying efficient algorithms such as findmax and find min*/
//Just Change Object - SIMPLE!
Collection c = new **PriorityQueue**():
c.add(1);
c.add(2);
c.contains(1);

集合接口方法

  1. int size : 返回集合的大小。
  2. boolean isEmpty : 如果集合为空则返回 true。
  3. boolean contains(Object o) :如果集合中存在对象 o,则返回 true。
  4. Iterator iterator() :返回指向集合的迭代器。
  5. Object[] toArray() :将集合转换为 Object 类型的数组。
  6. T[] toArray(T[] a) :返回包含集合所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
  7. boolean add(E e) :将元素 e 添加到集合中。如果操作成功则返回true。
  8. boolean remove(Object o) :从集合中删除对象 o。如果操作成功则返回true。
  9. boolean containsAll(Collection> c) :如果两个集合中的所有元素相同,则返回 true。如果操作成功则返回 true。 10.boolean addAll(Collection extends E> c) :添加两个集合的所有元素。如果操作成功则返回true。
  10. boolean removeAll(Collection> c) :从调用者集合中删除集合 c 的元素。如果操作成功则返回true。
  11. boolean keepAll(Collection> c) :仅保留集合 c.
  12. 中存在的元素
  13. voidclear() :清除集合中的所有元素。

通过实现集合类,我们可以重写上面的方法来创建自定义集合。以下是相同的示例。

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class CustomCollection implements Collection {
    private final ArrayList list = new ArrayList();

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        return list.contains(o);
    }

    @Override
    public Iterator iterator() {
        return new Iterator() {
            private int index = 0;

            @Override
            public boolean hasNext() {
                return index  T[] toArray(T[] a) {
        return list.toArray(a);
    }

    @Override
    public boolean add(E e) {
        return list.add(e);
    }

    @Override
    public boolean remove(Object o) {
        return list.remove(o);
    }

    @Override
    public boolean containsAll(Collection> c) {
        return list.containsAll(c);
    }

    @Override
    public boolean addAll(Collection extends E> c) {
        return list.addAll(c);
    }

    @Override
    public boolean removeAll(Collection> c) {
        return list.removeAll(c);
    }

    @Override
    public boolean retainAll(Collection> c) {
        return list.retainAll(c);
    }

    @Override
    public void clear() {
        list.clear();
    }
}


列表接口

Java中的List接口是Java Collections Framework的一部分,并且扩展了Collection接口。它表示一个有序集合(也称为序列),允许位置访问、重复元素以及对其元素进行迭代。 List 接口由几个类实现,例如 ArrayList、LinkedList、Vector 和 Stack。

列表界面的主要特征:

  1. 有序集合:列表保留元素的插入顺序,这意味着可以通过索引访问元素。
  2. 允许重复:列表可以包含重复元素,与不允许重复的集合不同。
  3. 位置访问:可以通过索引访问、添加或删除列表中的元素。
  4. 迭代:List 接口允许增强 for 循环,以及使用 Iterator 或 ListIterator 进行迭代。

List接口常用方法:
所有集合接口方法也由List接口实现,因为List接口扩展了Collection接口。

  1. void add(int index, E element):在此列表中的指定索引处插入指定元素 E。
  2. E get(int index):返回此列表中指定位置的元素。
  3. E remove(int index):删除列表中指定位置的元素。
  4. E set(int index, E element):用指定元素替换此列表中指定位置的元素。
  5. int indexOf(Object o):返回指定元素第一次出现的索引,如果列表不包含该元素,则返回 -1。
  6. int lastIndexOf(Object o):返回指定元素最后一次出现的索引,如果列表不包含该元素,则返回 -1。
  7. List subList(int fromIndex, int toIndex):返回此列表中指定的 fromIndex(包含)和 toIndex(不包含)之间的部分的视图。
import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("Java");
        list.add("Collections");
        list.add("Framework");

        // Accessing elements by index
        System.out.println("First Element: "   list.get(0));

        // Removing an element by index
        list.remove(1);
        System.out.println("After Removal: "   list);

        // Updating an element
        list.set(1, "Updated Element");
        System.out.println("Updated List: "   list);

        // Using a sublist
        List sublist = list.subList(0, 1);
        System.out.println("Sublist: "   sublist);
    }
}

版本声明 本文转载于:https://dev.to/harsh_khanpara_e78fd42c5a/java-collection-framework-4fm8?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么sync.Once使用atomic.StoreUint32而不是标准分配?
    为什么sync.Once使用atomic.StoreUint32而不是标准分配?
    sync.Once中的原子内存排序在探索sync.Once的源代码时,我们偶然发现了使用atomic背后的原因。 StoreUint32 而不是像 o.done = 1 这样的标准赋值。Go 中的内存排序并发编程中的一个基本概念是内存排序,它确保共享内存在所有处理器上一致地观察到访问。然而,不同的架...
    编程 发布于2024-11-07
  • 为什么无法在 PHP 中使用匿名函数初始化属性?
    为什么无法在 PHP 中使用匿名函数初始化属性?
    使用匿名函数初始化属性:为什么以及如何?如下面的代码片段中所述,在类声明在 PHP 中触发“解析错误:语法错误,意外的 T_FUNCTION”。然而,在构造函数中将函数分配给属性是可能的,如第二个片段所示。// Property initialization with anonymous funct...
    编程 发布于2024-11-07
  • [Flatiron SE] 第 24 天
    [Flatiron SE] 第 24 天
    大家好,在这里吃饭, 这将是我的第一篇博客文章!我是应熨斗学校出色的老师的要求这样做的。我将尝试每天发表一篇博客文章,记录我在编码过程中的发展。您好,欢迎,以及将来阅读本文的雇主! 现在我需要说实话,这实际上并不是我使用熨斗的“第一天”。我实际上是在两天前的星期一开始的。但我相信今天绝对是我真正投入...
    编程 发布于2024-11-07
  • 保护 JavaScript 应用程序的安全:常见漏洞以及如何避免它们
    保护 JavaScript 应用程序的安全:常见漏洞以及如何避免它们
    JavaScript 是最流行的 Web 开发语言之一,但由于其广泛使用,它也是攻击者的常见目标。保护 JavaScript 应用程序的安全对于避免可能导致数据被盗、用户帐户受损等安全漏洞至关重要。本文将探讨 JavaScript 应用程序中的一些常见漏洞并提供缓解这些漏洞的策略。 ...
    编程 发布于2024-11-07
  • 如何从 Flask 中的 URL 中提取命名参数?
    如何从 Flask 中的 URL 中提取命名参数?
    从 Flask 中的 URL 中提取命名参数假设您有一个类似 http://10.1.1.1:5000/login?username 的 URL =alex&password=pw1 您希望 Flask 应用程序处理。要访问问号后指定的参数,请使用 request.args,而不是 request....
    编程 发布于2024-11-07
  • 一级抽象:简洁函数的关键
    一级抽象:简洁函数的关键
    曾经在看过一个函数后,感到迷失在它的复杂性中吗?让我们探讨一下干净代码的基本原则:函数应该只维护一个抽象级别。 这是在 Web 应用程序中创建用户的真实示例: // ❌ A function doing too many things at different abstraction levels ...
    编程 发布于2024-11-07
  • 在 JavaScript 中编写简洁且可维护的代码的最佳实践
    在 JavaScript 中编写简洁且可维护的代码的最佳实践
    干净且可维护的代码对于任何软件项目的长期成功和可扩展性至关重要。它改善了团队成员之间的协作,减少了错误的可能性,并使代码更易于理解、测试和维护。在这篇博文中,我们将探讨一些在 JavaScript 中编写干净且可维护的代码的最佳实践,以及说明每种实践的代码示例。 1. 一致的代码格式...
    编程 发布于2024-11-07
  • 促进软件开发成功:整合跨学科技能以获得更好的结果
    促进软件开发成功:整合跨学科技能以获得更好的结果
    In today's world of software development, success is more than just technical know-how. Teams that work well together and mix different skills in vari...
    编程 发布于2024-11-07
  • WatchYourLAN - 轻量级网络 IP 扫描器
    WatchYourLAN - 轻量级网络 IP 扫描器
    WatchYourLAN的主要特点 找到新主机时发送通知 监控主机在线/离线历史记录 保留网络中所有主机的列表 发送数据到InfluxDB2制作Grafana仪表板 v2 有什么新功能? 基础API 导出到 InfluxDB2 SQLite 和 PostgreSQL...
    编程 发布于2024-11-07
  • 掌握 React Native 中的深度链接和通用链接:OpenGraph Share 和 Node.js 集成
    掌握 React Native 中的深度链接和通用链接:OpenGraph Share 和 Node.js 集成
    设想 假设您有一个名为 ShopEasy 的电子商务应用程序,并且您希望点击电子邮件、消息或社交媒体中的产品链接的用户被直接重定向到应用程序中的相关产品页面,而不是网站。 步骤1:在nodejs服务器中进行Opengraph配置以进行链接预览: Open Graph...
    编程 发布于2024-11-07
  • 如何在不使用“eval”的情况下安全地解析“宽松”JSON?
    如何在不使用“eval”的情况下安全地解析“宽松”JSON?
    在没有风险评估的情况下解析“轻松”的 JSONJSON 是一种广泛使用的数据交换格式,需要带引号的键的严格语法。但是,某些应用程序可能会遇到带有不带引号的键的“宽松”JSON。由于安全风险,不鼓励使用 eval 解析此类数据。避免邪恶的 Evaleval 的一种替代方法是基于正则表达式的方法,该方法...
    编程 发布于2024-11-07
  • 通过sponge+dtm快速轻松实现高性能的电商系统
    通过sponge+dtm快速轻松实现高性能的电商系统
    This article demonstrates how to use the Sponge framework to quickly build a simplified high-performance e-commerce system, implementing flash sale an...
    编程 发布于2024-11-07
  • 什么是 Java 中的关闭钩子以及如何有效地使用它?
    什么是 Java 中的关闭钩子以及如何有效地使用它?
    1. 了解关闭钩子 关闭钩子是 Java 中的一种特殊构造,允许您注册一个线程,该线程将在 Java 虚拟机 (JVM) 关闭时执行。这可以由各种事件触发,例如用户中断 (Ctrl C)、系统关闭或编程终止。 1.1 关闭钩子如何工作 当 JVM 启动时,它会创建...
    编程 发布于2024-11-07
  • 在 Web 工具中使用 JavaScript 进行安全加密
    在 Web 工具中使用 JavaScript 进行安全加密
    这是开发人员用来帮助保护程序中的敏感信息免受潜在攻击者攻击的方法。加密将可读数据转变为编码格式,只有使用正确的密钥才能解码;因此,它对于保护密码、财务详细信息和个人数据等信息的安全至关重要。 在数据泄露和网络攻击非常猖獗的时候,这一点变得非常重要。通过加密数据,开发人员将确保没有未经授权的一方在网络...
    编程 发布于2024-11-07
  • 如何将 java.util.Date 转换为 java.time 类型?
    如何将 java.util.Date 转换为 java.time 类型?
    将 java.util.Date 转换为 java.time 类型遗留的 java.util.Date 和 Calendar 类以其复杂性而闻名和麻烦。虽然建议使用 java.time 框架进行日期时间管理,但在使用现有代码时,必须在这些新旧类型之间进行转换。映射到 java.time 类型将 ja...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3