.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList<T>( 六 )


(六) 結點類 LinkedListNode<T>

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
包含四個字段:list 結點所在的鏈表;next 結點的下一個節點;prev 結點的上一個結點;item 結點內部存儲的元素 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
兩種初始化的方式,沒有默認構造器 。也就是說,在定義節點時必須對其賦值(默認為 null) 。但鏈表 LinkedList 是有默認構造器的 。
對結點包括以下三種查詢操作(Next、Previous、Value):
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
三、C# 與 Java 中的鏈表結構單個數據結構其實沒有太多要講的內容,既然 C# 與 Java 是兩大較為著名的 OO 語言,那在此就對比一下二者在實現鏈表結構時的異同 。
(一) 結點類 Node<E>
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
可以知道,Java 中的鏈表結構也是雙向鏈表 。
(二) 構造方法
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
Java 中的 LinkedList 有兩個構造方法 。不過差別不大,只不過 C# 中的 LinekdList<T> 還多了一個可列化的元素集 。
(三) 屬性
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
注:在 Java 中此類變量稱作屬性,沒有字段的概念;在 C# 中此類變量稱作字段,而屬性是針對字段而設計的訪問器,用于增強安全性 。
除去 C# LinkedList 中的三個特殊字段,其余與 Java LinkedList 一致 。
(四) 方法:添加 add()、addFirst() 與 addLast() 方法
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
可以看到,C# 中的添加方法內置方法 InternalInsert…();Java 中也和 C# 類似,均調用其他來實現 。鑒于相似性 , 下面就只展示一下方法 linkLast() 不做分析 。
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
總結區別不大 。硬要說,就可能是運行時 CLR(公共語言運行庫) 于 JVM(Java 虛擬機) 優化性能的差異了 。
[# 有關可空類型、Nullable<T>與特性 [Nullable] ]一、可空類型眾所周知,在C# 中,值類型時不可空的,引用類型是可空的:
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
過了一段時間,大概在 C# 5 時期,引入了可空值類型,長這樣:
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
然后又又又過了一段時間,應該是在 C# 8 引入了,可空引用類型:
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
調用一下反匯編 , 看看加了一個問號會不會對數據類型產生影響
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖

.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
string? 依然是 string,int? 不再是 int , 而是變成了 Nullable 類型,相當于:
.NET 源碼學習 [數據結構-線性表1.2] 鏈表與 LinkedList&lt;T&gt;

文章插圖
二、為什么要引入可空引用類型?分析一下這個有意思的 CS8600 警告:
嚴重性
代碼
說明
警告
CS8600
將 null 文本或可能的 null 值轉換為不可為 null 類型 。
嘿!我大引用類型什么時候變成不可為 null 類型了?根據微軟文檔的解釋:該警告的目的是將應用程序在運行時引發 System.NullReferenceException 的可能性降至最低 。簡單說就是降低代碼在運行時引發空引用異常的概率,這一做法會讓程序在運行時帶來一些效率上的提高 。至于是怎么提高的,應該是避免了異常的頻繁發生 , 導致程序頻繁終止 。(個人觀點,僅供參考) 。
三、Nullable<T> 的實現[注意:Nullable<T> 和 Nullable 是兩個不同的概念,前一個是結構體,后一個是類;當然二者都是數據類型]

推薦閱讀