(六) 结点类 LinkedListNode<T>
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6425X9-42.png)
文章插图
包含四个字段:list 结点所在的链表;next 结点的下一个节点;prev 结点的上一个结点;item 结点内部存储的元素 。
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6421448-43.jpg)
文章插图
两种初始化的方式,没有默认构造器 。也就是说,在定义节点时必须对其赋值(默认为 null) 。但链表 LinkedList 是有默认构造器的 。
对结点包括以下三种查询操作(Next、Previous、Value):
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K64251a-44.png)
文章插图
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6423Q2-45.jpg)
文章插图
三、C# 与 Java 中的链表结构单个数据结构其实没有太多要讲的内容,既然 C# 与 Java 是两大较为著名的 OO 语言,那在此就对比一下二者在实现链表结构时的异同 。
(一) 结点类 Node<E>
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6426326-46.jpg)
文章插图
可以知道,Java 中的链表结构也是双向链表 。
(二) 构造方法
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6425V3-47.png)
文章插图
Java 中的 LinkedList 有两个构造方法 。不过差别不大,只不过 C# 中的 LinekdList<T> 还多了一个可列化的元素集 。
(三) 属性
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K64244I-48.png)
文章插图
注:在 Java 中此类变量称作属性,没有字段的概念;在 C# 中此类变量称作字段,而属性是针对字段而设计的访问器,用于增强安全性 。
除去 C# LinkedList 中的三个特殊字段,其余与 Java LinkedList 一致 。
(四) 方法:添加 add()、addFirst() 与 addLast() 方法
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL2ltZzIwMjIuY25ibG9ncy5jb20vYmxvZy8yODUxNTQwLzIwMjIxMS8yODUxNTQwLTIwMjIxMTA4MTM1NTM0ODE4LTQyMTA0NTcwMi5wbmc=.jpg)
文章插图
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6424323-50.png)
文章插图
可以看到,C# 中的添加方法内置方法 InternalInsert…();Java 中也和 C# 类似,均调用其他来实现 。鉴于相似性 , 下面就只展示一下方法 linkLast() 不做分析 。
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6426323-51.png)
文章插图
总结区别不大 。硬要说,就可能是运行时 CLR(公共语言运行库) 于 JVM(Java 虚拟机) 优化性能的差异了 。
[# 有关可空类型、Nullable<T>与特性 [Nullable] ]一、可空类型众所周知,在C# 中,值类型时不可空的,引用类型是可空的:
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6424391-52.png)
文章插图
过了一段时间,大概在 C# 5 时期,引入了可空值类型,长这样:
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL2ltZzIwMjIuY25ibG9ncy5jb20vYmxvZy8yODUxNTQwLzIwMjIxMS8yODUxNTQwLTIwMjIxMTA4MTM1NTM0NjU4LTI3ODU2MDQ5MS5wbmc=.jpg)
文章插图
然后又又又过了一段时间,应该是在 C# 8 引入了,可空引用类型:
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6421538-54.jpg)
文章插图
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
调用一下反汇编 , 看看加了一个问号会不会对数据类型产生影响
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6423534-55.png)
文章插图
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K64211C-56.jpg)
文章插图
string? 依然是 string,int? 不再是 int , 而是变成了 Nullable 类型,相当于:
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K64230J-57.png)
文章插图
二、为什么要引入可空引用类型?分析一下这个有意思的 CS8600 警告:
严重性
代码
说明
警告
CS8600
将 null 文本或可能的 null 值转换为不可为 null 类型 。
嘿!我大引用类型什么时候变成不可为 null 类型了?根据微软文档的解释:该警告的目的是将应用程序在运行时引发 System.NullReferenceException 的可能性降至最低 。简单说就是降低代码在运行时引发空引用异常的概率,这一做法会让程序在运行时带来一些效率上的提高 。至于是怎么提高的,应该是避免了异常的频繁发生 , 导致程序频繁终止 。(个人观点,仅供参考) 。
三、Nullable<T> 的实现[注意:Nullable<T> 和 Nullable 是两个不同的概念,前一个是结构体,后一个是类;当然二者都是数据类型]
推荐阅读
- MPC:百万富翁问题
- Redisson源码解读-公平锁
- 重新整理 .net core 实践篇 ———— dotnet-dump [外篇]
- PGL Paddle Graph Learning 关于图计算&图学习的基础知识概览:前置知识点学习
- .Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗
- OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
- 关于ASP.NET Core WebSocket实现集群的思考
- .NET周报【11月第1期 2022-11-07】
- JVM学习笔记——内存模型篇