」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Java集合框架

Java集合框架

發佈於2024-11-07
瀏覽:542

问什么是 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]刪除
最新教學 更多>
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-07-09
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-07-09
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-09
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-07-09
  • PHP與C++函數重載處理的區別
    PHP與C++函數重載處理的區別
    作為經驗豐富的C開發人員脫離謎題,您可能會遇到功能超載的概念。這個概念雖然在C中普遍,但在PHP中構成了獨特的挑戰。讓我們深入研究PHP功能過載的複雜性,並探索其提供的可能性。 在PHP中理解php的方法在PHP中,函數超載的概念(如C等語言)不存在。函數簽名僅由其名稱定義,而與他們的參數列表無關...
    程式設計 發佈於2025-07-09
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-07-09
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-07-09
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-07-09
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-07-09
  • 解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    解決MySQL插入Emoji時出現的\\"字符串值錯誤\\"異常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    程式設計 發佈於2025-07-09
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-07-09
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-09
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-07-09
  • 用戶本地時間格式及時區偏移顯示指南
    用戶本地時間格式及時區偏移顯示指南
    在用戶的語言環境格式中顯示日期/時間,並使用時間偏移在向最終用戶展示日期和時間時,以其localzone and格式顯示它們至關重要。這確保了不同地理位置的清晰度和無縫用戶體驗。以下是使用JavaScript實現此目的的方法。 方法:推薦方法是處理客戶端的Javascript中的日期/時間格式化和...
    程式設計 發佈於2025-07-09
  • Python環境變量的訪問與管理方法
    Python環境變量的訪問與管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    程式設計 發佈於2025-07-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3