首頁 Java Java入門 java常用資料結構有哪些

java常用資料結構有哪些

Apr 14, 2021 pm 04:52 PM
java 資料結構

java資料結構有:1、陣列;2、鍊錶,一種遞歸的資料結構;3、棧,依照「後進先出」、「先進後出」的原則來儲存資料;4、隊列;5、樹,是由n(n>0)個有限節點組成的一個具有層次關係的集合;6、堆;7、圖;8、哈希表。

java常用資料結構有哪些

本教學操作環境:windows7系統、java8版、DELL G3電腦。

Java常見資料結構

#這 8 種資料結構有什麼差別呢?

①、陣列

優點:

  • 依照索引查詢元素的速度很快;

  • 依照索引遍歷陣列也很方便。

缺點:

  • 陣列的大小在建立後就確定了,無法擴容;

  • 陣列只能儲存一種類型的資料;

新增、刪除元素的操作很耗時間,因為要移動其他元素。

②、鍊錶

  • #《演算法(第4 版)》一書中是這樣定義鍊錶的:

    鍊錶是一種遞歸的資料結構,它或是為空(null),或是指向一個結點(node)的引用,該節點還有一個元素和一個指向另一個鍊錶的引用。

    Java 的LinkedList 類別可以很形像地透過程式碼的形式來表示一個鍊錶的結構:

public class LinkedList<E> {
    transient Node<E> first;
    transient Node<E> last;

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
}
登入後複製
  • 這是一種雙向鍊錶,目前元素item 既有prev 又有next,不過first 的prev 為null,last 的next 為null。如果是單向鍊錶的話,就只有 next,沒有 prev。

由於不必按照順序的方式存儲,鍊錶在插入、刪除的時候可以達到O(1) 的時間複雜度(只需要重新指向引用即可,不需要像陣列那樣移動其他元素)。除此之外,鍊錶也克服了陣列必須預先知道資料大小的缺點,從而可以實現靈活的記憶體動態管理。

優點:

  • 不需要初始化容量;

  • 可以加入任意元素;

  • 插入和刪除的時候只需要更新引用。

缺點:

  • 含有大量的引用,佔用的記憶體空間大;

  • 查找元素需要遍歷整個鍊錶,耗時。

③、堆疊

#堆疊就好像水桶一樣,底部是密封的,頂部是開口,水可以進可以出。用過水桶的小夥伴應該要明白這樣一個道理:先進去的水在桶的底部,後進去的水在桶的頂部;後進去的水先被倒出來,先進去的水後被倒出來。

同理,堆疊依照「後進先出」、「先進後出」的原則來儲存數據,先插入的數據被壓入棧底,後插入的數據在棧頂,讀出數據的時候,從棧頂開始依序讀出。

④、佇列

#佇列就好像一段水管一樣,兩端都是開口的,水從一端進去,然後從另外一端出來。先進去的水先出來,然後進去的水再出來。

和水管有些不同的是,隊列會對兩端進行定義,一端叫隊頭,另外一端就叫隊尾。隊頭只允許刪除操作(出隊),隊尾只允許插入操作(入隊)。

⑤、樹

#樹是典型的非線性結構,它是由n (n>0)個有限節點組成的一個具有層次關係的集合。

之所以叫“樹”,是因為這種資料結構看起來就像是一個倒掛的樹,只不過根在上,葉在下。樹狀資料結構有以下這些特點:

  • 每個節點都只有有限個子節點或無子節點;

  • ##沒有父節點的節點稱為根節點;

  • 每一個非根節點有且只有一個父節點;

  • 除了根節點外,每個子節點可分為多個不相交的子樹。

下圖展示了樹的一些術語:

 

 

 

基於二元查找樹的特點,它相比較於其他資料結構的優勢就在於尋找、插入的時間複雜度較低,為O(logn)。假如我們要從上圖找5 個元素,先從根節點7 開始找,5 必定在7 的左側,找到4,那5 必定在4 的右側,找到6,那5 必定在6 的左側,找到了。

理想情況下,透過 BST 找出節點,所需檢查的節點數可以減半。

平衡二元樹:當且僅當任何節點的兩棵子樹的高度差不大於 1 的二元樹。由前蘇聯的數學家 Adelse-Velskil 和 Landis 在 1962 年提出的高度平衡的二元樹,根據科學家的英文名字也稱為 AVL 樹。

平衡二元樹本質上也是一顆二元查找樹,不過為了限制左右子樹的高度差,避免出現傾斜樹等偏向於線性結構演化的情況,所以對二叉搜尋樹中每個節點的左右子樹作了限制,左右子樹的高度差稱為平衡因子,樹中每個節點的平衡因子絕對值不大於1。

平衡二元樹的困難在於,當刪除或增加節點的情況下,如何透過左旋或右旋的方式來保持左右平衡。

Java 中最常見的平衡二元樹是紅黑樹,節點是紅色或黑色,透過顏色的限制來維持著二元樹的平衡:

1)每個節點都只能是紅色或黑色

2)根節點是黑色

3)每個葉節點(NIL 節點,空節點)是黑色的。

4)如果一個節點是紅色的,則它兩個子節點都是黑色的。也就是說一條路徑上不能出現相鄰的兩個紅色節點。

5)從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

 

⑥、堆

#堆可以被看做是一棵樹的陣列對象,具有以下特點:

  • 堆中某個節點的值總是不大於或不小於其父節點的值;

  • ##堆總是一棵完全二元樹。

將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

 

 

在線性結構中,資料元素之間滿足唯一的線性關係,每個資料元素(除第一個和最後一個外)均有唯一的「前驅」與「後繼」;

在樹狀結構中,資料元素之間有著明顯的層次關係,且每個資料元素只與上一層中的一個元素(父節點)及下一層的多個元素(子節點)相關;

而在圖形結構中,節點之間的關係是任意的,圖中任兩個資料元素之間都有可能相關。

⑧、哈希表

哈希表(Hash Table),也叫散列表,是一種可以透過關鍵碼值(key-value)直接存取的資料結構,它最大的特點就是可以快速實現查找、插入和刪除。

陣列的最大特點是尋找容易,插入和刪除困難;而鍊錶正好相反,尋找困難,而插入和刪除容易。哈希表很完美地結合了兩者的優點, Java 的 HashMap 在此基礎上也加入了樹的優點。

 

#雜湊函數在雜湊表中起⾮常關鍵的作⽤,它可以把任意長度的輸入轉換成固定長度的輸出,該輸出就是哈希值。雜湊函數使得一個資料序列的存取過程變得更加迅速有效,透過雜湊函數,資料元素能夠被很快的進行定位。

若關鍵字為 k,則其值存放在 

hash(k) 的儲存位置。由此,不需要遍歷就可以直接取得 k 對應的值。

對於任意兩個不同的資料區塊,其雜湊值相同的可能性極小,也就是說,對於一個給定的資料區塊,找到和它雜湊值相同的資料區塊極為困難。再者,對於一個資料區塊,即使只改動它的一個位元,其雜湊值的改變也會非常的大——這正是 Hash 存在的價值!

儘管可能性極小,但仍然會發生,如果雜湊衝突了,Java 的HashMap 會在陣列的同一個位置上增加鍊錶,如果鍊錶的長度大於8,將會轉換成紅黑樹進行處理-這就是所謂的拉鍊法(陣列鍊錶)。

更多程式相關知識,請造訪:程式設計影片! !

以上是java常用資料結構有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles