【JAVA集合框架二 】java集合框架容器 java框架層級 繼承圖結構 集合框架的抽象類 集合框架主要實現類

来源:https://www.cnblogs.com/noteless/archive/2018/07/09/9282037.html
-Advertisement-
Play Games

本文關鍵詞: java集合框架 框架設計理念 容器 繼承層級結構 繼承圖 集合框架中的抽象類 主要的實現類 實現類特性 集合框架分類 集合框架併發包 併發實現類 什麼是容器? 由一個或多個確定的元素所構成的整體叫做集合。 容器用來包裝或裝載物品的貯存器 (如箱、罐、壇)或者成形或柔軟不成形的包覆材料 ...


本文關鍵詞:

java集合框架  框架設計理念  容器 繼承層級結構 繼承圖 集合框架中的抽象類  主要的實現類 實現類特性   集合框架分類 集合框架併發包 併發實現類

 

什麼是容器?

由一個或多個確定的元素所構成的整體叫做集合。

容器用來包裝或裝載物品的貯存器   (如箱、罐、壇)或者成形或柔軟不成形的包覆材料。

在Java中的Collection框架,有的人叫做集合有的叫做容器,不管怎麼叫基本上也離不開"把元素裝起來"這個本質.

我們的世界裡面豐富多彩,有各種各樣的事物,很多事物都會有他的容器

人的生活自然也離不開各種容器,喝水需要杯子,吃飯需要碗,煮湯需要鍋,這都是容器;

容器有各種各樣的形狀,也有各種各樣的特性;

比如茶杯有的有蓋子,有的沒有蓋子,水壺可以從壺嘴往外倒水等

java是面向對象的語言,萬事萬物皆是對象,縱然有著千姿百態的各種不同類型

所以想要在java對象中更加暢快的使用對象,自然也是需要容器的;

 

為什麼要有容器?

按照容器的概念,數組也是一種容器,可以用於存放一個或者多個元素;

可是,數組只能保存同一種類型的元素,而且長度是固定的;

人們自然希望可以有一種容器能夠保存各種不同的類型的元素,並且長度是不固定的;

這也是集合框架設計的初衷;

提供一種可以保存多種類型元素,並且長度不受限制的容器,來更加方便的保存對象;

所以java中的容器也就是java世界裡面承裝對象的器皿.

JAVA集合框架本質

容器根本屬性在於存/取,以及一些其他的附加的操作.

容器內部有其擺放形式:排成一行還是扔到一堆?

也有他的存取順序:先進先出還是先進後出的被壓倒最下麵?

這是抽象的描述

對應到電腦科學的世界裡面,那即是數據結構與演算法的描述

數據結構是指相互之間存在著一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成

數據結構中有線性結構,樹形結構等,形式有隊列  棧 鍵值對 等

至此,可以這麼理解編程語言中的集合框架:

集合框架目的就只是為了盛裝對象,操作對象

本質就是Java語言,針對於容器這一概念,數據結構與演算法的描述實現.

更直白的說,也就只是數據結構與演算法,java只是一個表現形式

比如LinkedList 他就是java語言對於雙向鏈表的一種描述,如果你懂雙向鏈表的原理,並且懂得java的語法,你也可以實現一個LinkedList

 

不過,選取哪些數據結構,使用哪些演算法,繼承層級如何安排,這是java自己的特點;

集合框架的層級結構

當然,並不是說你用Java編寫一個雙向鏈表就是寫出來集合框架了Java是面向對象的語言,面向對象的三大基礎特征,封裝繼承多態嘛想要給一門編程語言提供一個集合框架,自然不是寫幾個演算法數據結構這麼簡單的事情Java中的集合框架是自頂而下設計的如同所有的對象的祖宗都是Object一樣集合框架自然也是有祖宗的,那就是Collection 這就表示集合 ,在Java中用來存儲元素的容器
不過也還有另外一派,叫做Map ,如官方文檔中描述的那樣,Map並不算是集合,只不過是一種操作數據的結構而已但是Map也提供了類似集合似的存取元素,元素操作等功能廣義上按照我們之前說的集合/容器的概念去理解的話,自然他也可以算得上是Java集合的一份子所以一般都是把Map和Collection統稱為Java的集合體系的鑒於Java語言的特性,集合體系中這些用於刻畫家族臉譜的東西,自然都是介面,除非特別指明,所提到的類型均為介面
Collection中是一組獨立的元素而Map中則是一組成對的鍵值對元素
一組獨立的元素,Collection,中又可以按照有序的列表和無序的集,這就是List 和Set當然還有Queue,隊列其實話說回來,為何Queue直接繼承自Collection?有序和無序的並集不就已經是整體了麽隊列不也算是一種特殊的List麽,的確隊列是一種特殊的List,而且,常用的實現類LinkedList

.....implements List<E>, Deque<E>..... 並且其中 interface Deque<E> extends Queue<E> 
所以說,隊列邏輯思維意義上就是列表中比較特殊的一種,只不過他的特殊性比較多
所以在實現代碼的時候把它單獨拿出來直接繼承自Collection 作為一種大的分類
也我覺得也並沒有什麼太大的違和感,個人理解,歡迎指正
 
現在我們已經"高屋建瓴"的把集合Collection分為了 List  Set Queue這三種,再加上剛纔說到的Map
  1. 列表(List):List集合區分元素的順序,允許包含相同的元素,訪問集合中的元素可以根據元素的索引來訪問。
  2. 集(Set):Set集合不區分元素的順序,不允許包含相同的元素,訪問集合中的元素只能根據元素本身來訪問(也是集合里元素不允許重覆的原因)。
  3. 映射(Map):Map集合保存的”鍵”-“值”對,“鍵”不能重覆,而且一個“鍵”只能對應一個“值”,訪問時只能根據每項元素的key來訪問其value。
  4. 隊列(Queue) 沒什麼好理解的,就是類似隊伍的概念,詳細的以後再說

四大天王已經誕生了

Set和Map本身是無序的,在此基礎上又增加了排序的概念

所以家族裡面又多出來sortedSet 和   sortedMap

既然有了排序的概念,那麼在此之上繼續增加個可搜索的功能也沒什麼好奇怪的

也就是

NavigableSet 和  NavigableMap 

不得不說,美國人英語真好

Queue隊列中又分為:

雙端隊列Deque    (double ended queue)

所以主要的介面是這些:

Collection

|---List

|---Set

   |---sortedSet

   |---NavigableSet

|---Queue

   |---Deque

|---Map

          |---sortedMap

      |---NavigableMap

 

 

至此,對於java集合來說,意識形態層面的設計已經完成.

集合框架的抽象類

一人心難如萬人意,集合框架設計者也明白這個道理

自然知道提供的實現類並不能滿足所有人需求,自然有人想要自己實現,

如果從頭寫來一個自然是代價巨大,考慮到這點,集合框架提供了不少的抽象類,抽象類實現了大部分通用的方法

你想要實現,只需要繼承抽象類,並且實現必要的幾個方法即可

當然,集合的設計本身也是這個思路,一舉兩得,自己寫的這麼方便的東西,沒道理不用;

 

抽象類大多數以Abs開頭的

 

AbstractCollection:

提供了Collection的主要實現

  1. 為了實現一個不可修改的集合,程式員只需要擴展這個類併為iteratorsize 方法提供實現。(iterator方法返回的迭代器必須實現hasNext和next。)
  2. 為了實現一個可修改的集合,程式員必須另外重寫這個類的add方法(否則拋出一個UnsupportedOperationException),迭代器方法返回的迭代器必須另外實現它的remove方法。

Collection 下的大多數子類都繼承 AbstractCollection ,比如 List 的實現類, Set的實現類。

 

AbstractList

List介面的骨架實現,最大限度地減少實現由“隨機訪問”數據存儲(如數組)所支持的介面所需的工作量。

對於順序訪問數據(如鏈接列表),應該優先使用AbstractSequentialList。

 

AbstractSequentialList

List介面的骨架實現,以最大限度地減少實現由“順序訪問”數據存儲(如鏈接列表)支持的介面所需的工作量。

對於隨機訪問數據(如數組),應優先使用AbstractList。

 

AbstractSet

 

提供了Set介面的骨架實現,不會覆蓋AbstractCollection類中的任何實現。它只是增加了equals和hashCode的實現。

通過擴展此類來實現集合的過程與通過擴展AbstractCollection來實現集合的過程相同

不同之處在於此類的所有子類中的所有方法和構造函數都必須遵守Set介面施加的額外約束(例如,添加方法不得允許將一個對象的多個實例添加到一個集合中)。

 

AbstractQueue

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參考學習:https://www.cnblogs.com/liwenzhou/p/7999532.html ...
  • 在 Android 和 Window 平臺下,有時候我們需要監聽返回按鍵的事件來進行相應的操作,也就是自定義返回按鍵事件。下麵根據一個例子來講解如何在 ionic 中自定義返回按鍵事件。 功能需求 首先看下要通過自定義返回按鍵事件來實現的需求(均在點擊返回鍵操作之後): 如果鍵盤打開,則隱藏鍵盤; ...
  • 打開包的 -- 吧xsd文件改為: 其他的也類似 ...
  • 一. Dubbo誕生背景 隨著互聯網的發展和網站規模的擴大,系統架構也從單點的垂直結構往分散式服務架構演進,如下圖所示: 單一應用架構:一個應用部署所有功能,此時簡化CRUD的ORM框架是關鍵 垂直應用架構:應用拆分為不相干的幾個應用,前後端分離,此時用於加速前端頁面開發的Web MVC框架是關鍵 ...
  • 1.頭文件 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> DTD聲明始終以!DOCTYPE開頭 configurat ...
  • 1. 通常防止爬蟲被反主要有以下幾個策略 (1)動態設置User Agent(隨機切換User Agent,模擬不同的瀏覽器) 方法1: 修改setting.py中的User Agent 方法2: 修改setting中的 DEFAULT_REQUEST_HEADERS 方法3 : 在代碼中修改 (2 ...
  • 往列表裡存放數據先進後出(左進) lpush names A B C D E 往列表裡存放數據後進先出(右進) rpush names G P H K 查看列表裡面的數據: lrange names 0(從0開始) -1 切片: lrange names start end(start end 代表 ...
  • 命令: hset info namehgetall infohkeys infohvlls info m系列批量處理: hmset info2 k1 v1 k2 v2 hmget info2 k1 k2 hlen獲取有幾個key hlen info2 hexists判斷是否存在: hexists i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...