java中容器繼承體系

首先上圖

?

源碼解析?

打開Collection接口源碼,能夠看到Collection接口是繼承了Iterable接口。

public interface Collection<E> extends Iterable<E> {
? ? /**
? ? ?* ......
? ? ?*/
}
?

?以下是Iterable接口源碼及注釋

/**
?* Implementing this interface allows an object to be the target of the "for-each loop" statement.
?* 實現這個接口允許一個對象成為for-each循環語句的目標
?*/
public interface Iterable<T> {
?? ?// 返回一個內部元素為T類型的迭代器(JDK1.5只有這個接口)
?? ?Iterator<T> iterator();
?? ?
?? ?// 遍歷內部元素,action意思為動作,指可以對每個元素進行操作(JDK1.8添加)
? ? default void forEach(Consumer<? super T> action) {
? ? ? ? Objects.requireNonNull(action);
? ? ? ? for (T t : this) {
? ? ? ? ? ? action.accept(t);
? ? ? ? }
? ? }
?? ?
?? ?// 創建并返回一個可分割迭代器(JDK1.8添加),分割的迭代器主要是提供可以并行遍歷元素的迭代器,可以適應現在cpu多核的能力,加快速度。
?? ?//(劃重點:并行遍歷元素 并行!)
?? ?default Spliterator<T> spliterator() {
?? ? ? ?return Spliterators.spliteratorUnknownSize(iterator(), 0);
?? ?}
}
?

Iterable接口定義了三個方法,其中兩個提供了默認實現,只有iterator()是要求實現類必須實現的方法。
那么當某個類實現了Iterable接口就可以使用foreach進行迭代。同時Iterable中又封裝了Iterator接口,那么這個類也可以使用Iterator迭代器。
因而有三種方式可以迭代Iterable實現類的對象:
1、for-each循環

List<String> list = new ArrayList><();
list.add("AAA");
list.add("BBB");
list.add("CCC");
for( String element : list ){
? ? System.out.println( element.toString() );
}
?

2、獲取Iterable實現類對象的迭代器(Iterator)

Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
? ? String element = iterator.next();
? ? System.out.println( element );
}
?

3、調用IterableforEach()方法

list.forEach( (element) -> {
? ? System.out.println( element );
});
?

?Iterator

通過上面我們可以看到,在iterable中我們有一個方法iterator可以返回一個Iterator的類。這個類的作用就是實現迭代。下面我們來看一下這個類的方法以及繼承體系。

雖然在架構層級中并未包含,Iterator接口(迭代器)也是集合大家庭中的一員。Iterator主要是為了方便遍歷集合中的所有元素(相當于是定義了遍歷元素的范式)。

iterator源碼

public interface Iterator<E> {
?? ?// 是否有下一個元素
?? ?boolean hasNext();?
?? ?
?? ?// 獲取下一個元素
?? ?E next(); ??
?? ?
?? ?// 移除元素
?? ?default void remove() {
?? ??? ?throw new UnsupportedOperationException("remove");
?? ?}
?? ? ? ?
?? ?// 對剩下的所有元素進行處理,action則為處理的動作,意為要怎么處理
?? ?default void forEachRemaining(Consumer<? super E> action) {
?? ??? ?Objects.requireNonNull(action);
?? ??? ?while (hasNext())
?? ? ? ?action.accept(next());
?? ?}
}
?

同樣Iterator也是一個接口,目的是在于把不同集合的遍歷方式抽象出來,這樣我們使用迭代器遍歷的時候,就不需要關注于集合內部結構,能夠使用Iterator的內部方法直接遍歷(也就是說,不管是針對List還是Set的遍歷,我們都能夠直接使用Iterator遍歷拿到集合元素,而不需要關心是List還是Set)。那么這個時候,如果使用的數據結構有所變化,我們不需要去維護原有遍歷集合的代碼,因此也可以理解Iterator是有將集合與集合的遍歷做了一個解耦。

Iterable Iterator兩兄弟的區別

Iterable接口是為了達到實現該接口的類,可以使用foreach循環的目的。
Iterator接口是基于迭代器模式,實現了對聚合類的存儲和遍歷的分離。
兩者所強調的內容不同:

Iterable接口強調的是實現Iterable接口可使用foreach語法遍歷,也可以使用迭代器遍歷。
Iterator接口強調其實現類可使用迭代器遍歷

參考鏈接:https://blog.csdn.net/weixin_45663027/article/details/134135420

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711288.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711288.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711288.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

makefileGDB使用

一、makefile 1、make && makefile makefile帶來的好處就是——自動化編譯&#xff0c;一旦寫好&#xff0c;只需要一個make命令&#xff0c;整個工程完全自動編譯&#xff0c;極大的提高了軟件開發的效率 下面我們通過如下示例來進一步體會它們的作用&#xff1a; ①…

使用 Python 實現一個飛書/微信記賬機器人,酷B了!

Python飛書文檔機器人 今天的主題是&#xff1a;使用Python聯動飛書文檔機器人&#xff0c;實現一個專屬的記賬助手&#xff0c;這篇文章如果對你幫助極大&#xff0c;歡迎你分享給你的朋友、她、他&#xff0c;一起成長。 也歡迎大家留言&#xff0c;說說自己想看什么主題的…

代碼隨想錄第天 78.子集 90.子集II

LeetCode 78 子集 題目描述 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&…

LeetCode 2581.統計可能的樹根數目:換根DP(樹形DP)

【LetMeFly】2581.統計可能的樹根數目&#xff1a;換根DP(樹形DP) 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 個節點的樹&#xff0c;節點編號為 0 到 n - 1 。樹用一個長度為 n - 1 的二維整數數組 edges…

debian/ubuntu 編譯安裝nginx php

debian/ubuntu 編譯安裝nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #關閉防火墻, 可能不需要 修改nginx運行用戶為tboqi 抱著log目錄可…

【通信基礎知識】完整通信系統的流程圖及各模塊功能詳解

2024.2.29 抱歉最近在寫畢設大論文&#xff0c;因此沒有太多時間更新。然而&#xff0c;在寫論文的過程中&#xff0c;發現自己對通信系統的了解還不夠全明白&#xff0c;因此差了一些碩博論文總結了一個完整的通信系統流程圖。若有不對的地方請多多指正//部分內容有參考ChatGP…

【Elasticsearch管理】網絡配置

文章目錄 HTTP高級網絡設置高級TCP設置 TransportTCP傳輸概要文件Transport跟蹤 線程池fixed線程池fixed_auto_queue_sizescaling處理器設置 HTTP Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點&#xff0c;甚至可以運行…

YOLOv7基礎 | 第2種方式:簡化網絡結構之yolov7.yaml(由104層簡化為30層)

前言:Hello大家好,我是小哥談。通過下載YOLOv7源碼可知,原始的yolov7.yaml文件是拆開寫的,比較混亂,也不好理解,并且為后續改進增添了很多困難。基于此種情況,筆者就給大家介紹一種將yolov7.yaml文件簡化的方法,將104層簡化為30層,并且參數量和計算量和原來是一致的,…

內存占用構造方法

#使用虛擬內存構造內存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #釋放消耗的虛擬內存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #內存占用可直接在/dev/shm目錄下寫文件

《極客時間 - 左耳聽風》【文章筆記個人思考】

《極客時間 - 左耳聽風》原文鏈接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 這里的Leader是在技術上取得優勢&#xff0c;而不是行政…

2024年2月個人工作生活總結

本文為 2024年2月工作生活總結。 研發編碼 一些警告修正記錄 這個月修正了個人所負責的工程警告&#xff0c;這些警告其實是前人的代碼遺留的&#xff0c;我續寫的代碼&#xff0c;除printf函數的%d、%ld格式&#xff0c;都在寫的過程中改了。 下面記錄一些典型的警告及應對…

NLP(一)——概述

參考書: 《speech and language processing》《統計自然語言處理》 宗成慶 語言是思維的載體&#xff0c;自然語言處理相比其他信號較為特別 word2vec用到c語言 Question 預訓練語言模型和其他模型的區別? 預訓練模型是指在大規模數據上進行預訓練的模型&#xff0c;通常…

測試環境搭建整套大數據系統(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三臺機器執行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下倆內容 1.三臺機器分別給予各自的broker_id…

git操作學習記錄,簡單易上手

配置git 的賬戶郵箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代碼回溯 git rest --hard [commit哈希值]git log命令只能查看以當前狀態為終點的歷史日志 git reflog命令&#x…

Python+neo4j構建豆瓣電影知識圖譜

文章目錄 數據來源數據整理導入節點和關系導入使用Subgraph批量導入節點和關系 多標簽實體和實體去重 數據來源 http://www.openkg.cn/dataset/douban-movie-kg 該網址擁有豐富的中文知識圖譜數據集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人員使用研究…

【golang】25、圖片操作

用 “github.com/fogleman/gg” 可以畫線, 框 用 “github.com/disintegration/imaging” 可以變換顏色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬蟲——Urllib庫-3

目錄 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 獲取豆瓣電影前十頁的數據 ajax的post請求 總結 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 首先可以在瀏覽器找到發送數據的接口 那么我們的url就可以在header中找到了 再加上UA這個header 進行請…

Facebook的元宇宙實踐:數字化社交的新前景

近年來&#xff0c;元宇宙&#xff08;Metaverse&#xff09;這一概念備受矚目&#xff0c;被認為是數字化社交的未來趨勢之一。而在眾多科技巨頭中&#xff0c;Facebook&#xff08;現更名為Meta&#xff09;一直處于元宇宙發展的前沿。在本文中&#xff0c;我們將深入探討Fac…

萬字帶你走過數據庫的這激蕩的三年

本文收集了卡內基梅隆大學計算機科學系數據庫學副教授 Andy Pavlo 從 2021 到 2023 連續三年對數據庫領域的回顧&#xff0c;希望通過連續三年的回顧讓你對數據庫領域的技術發展有所了解。 關于 Andy Pavlo&#xff1a;卡內基梅隆大學計算機科學系數據庫學副教授&#xff0c;數…

vuepress項目側邊欄菜單配置使用

第一種菜單配置&#xff0c;自定義菜單名稱 {text: 菜單名稱,// 是否折疊collapsible: true,children: [{text: "自定義md菜單名稱",sidebarDepth: 2,link: "/xxx/aa.md",children: [],}],},第二種菜單配置 標題自動生成菜單&#xff0c;使用需要搭配sideb…