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

Java集合框架

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

问什么是 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]刪除
最新教學 更多>
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-05-10
  • Python不會對超範圍子串切片報錯的原因
    Python不會對超範圍子串切片報錯的原因
    在python中用索引切片範圍:二重性和空序列索引單個元素不同,該元素會引起錯誤,切片在序列的邊界之外沒有。 這種行為源於索引和切片之間的基本差異。索引一個序列,例如“示例” [3],返回一個項目。但是,切片序列(例如“示例” [3:4])返回項目的子序列。 索引不存在的元素時,例如“示例” [9...
    程式設計 發佈於2025-05-10
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-05-10
  • Python中何時用"try"而非"if"檢測變量值?
    Python中何時用"try"而非"if"檢測變量值?
    使用“ try“ vs.” if”來測試python 在python中的變量值,在某些情況下,您可能需要在處理之前檢查變量是否具有值。在使用“如果”或“ try”構建體之間決定。 “ if” constructs result = function() 如果結果: 對於結果: ...
    程式設計 發佈於2025-05-10
  • 如何在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-05-10
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否需要手動調用“ delete”操作員在heap-exprogal exit exit上。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(HEAP內存)的指針。當應用程序退出時,此內存是否會自動發布?通常,是。但是,即使在...
    程式設計 發佈於2025-05-10
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-05-10
  • 在Java中如何為PNG文件添加坐標軸和標籤?
    在Java中如何為PNG文件添加坐標軸和標籤?
    如何用java 在現有png映像中添加軸和標籤的axes和labels如何註釋png文件可能具有挑戰性。與其嘗試可能導致錯誤和不一致的修改,不如建議在圖表創建過程中集成註釋。 使用JFReechArt import java.awt.color; 導入java.awt.eventqueue; 導...
    程式設計 發佈於2025-05-10
  • Python中嵌套函數與閉包的區別是什麼
    Python中嵌套函數與閉包的區別是什麼
    嵌套函數與python 在python中的嵌套函數不被考慮閉合,因為它們不符合以下要求:不訪問局部範圍scliables to incling scliables在封裝範圍外執行範圍的局部範圍。 make_printer(msg): DEF打印機(): 打印(味精) ...
    程式設計 發佈於2025-05-10
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-05-10
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-05-10
  • 切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    切換到MySQLi後CodeIgniter連接MySQL數據庫失敗原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    程式設計 發佈於2025-05-10
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-05-10
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-05-10
  • PHP陣列鍵值異常:了解07和08的好奇情況
    PHP陣列鍵值異常:了解07和08的好奇情況
    PHP數組鍵值問題,使用07&08 在給定數月的數組中,鍵值07和08呈現令人困惑的行為時,就會出現一個不尋常的問題。運行print_r($月份)返回意外結果:鍵“ 07”丟失,而鍵“ 08”分配給了9月的值。 此問題源於PHP對領先零的解釋。當一個數字帶有0(例如07或08)的前綴時,PHP...
    程式設計 發佈於2025-05-10

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

Copyright© 2022 湘ICP备2022001581号-3