手写集合框架LinkedList准备篇
Posted linjiab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写集合框架LinkedList准备篇相关的知识,希望对你有一定的参考价值。
Hello,我我我我林GG...我又回来了,短暂的假期~呼舒服(一次性看三部电影..一觉睡到中午 的感jio太....爽了),好勒,回到正题吧,请看下文。
自序:
很多人看到这种名词就打退堂鼓的,就跟二叉树、B树一样,我一开始也是这样的,nimd,听起来真的高大尚(沃特???这是NM啥玩意),它们都是一种数据结构,其实并不难理解,千万不要被一个个名字所吓住,要知道都是人思考而来的东西,你怕个扥啊怕。
一、 理解Node节点以及单双向链表
我们先说一下单双向链表把:
1.啥是链表?
答:你戴过项链没有?骑过自行车没有(单车链)?链表也就好比我们生活中的链条一样,一个数据接一个数据的串联起来 具体请看下图:
单向链表:
图画的丑了一点,双向链表咱就不画了,就是多了一个向下指向的。
不过在这里我要解释一下我为什么将每个数据画成以下这种形式的
我这样画是因为等下这样会有助于我们理解Node
这个类,因为我们在Node这个类中将会有一个当前对象,以及指向上一个对象、下一个对象的三个属性。
2.设计Node类
创建Node类,别问为什么,因为我们LinkedList里面就是这样干的,有一个Node类,然后整个链表也是围绕它而来的。
public class newNode {
Object object; //存储当前元素
public newNode Next; //指针 指向下一个
public newNode prev; //指针 指向上一个
public newNode() { //默认的构造器
}
public newNode(Object object) { //添加一个object的构造函数
this.object = object;
}
public newNode(Object object,newNode next) { //添加一个构造器 并有一个向下的指向
this.object = object;
this.Next = next;
}
}
这三个属性联系我上面这张图就很简单了,我解释一下为啥Next和prev
是它本类newNode
的这个数据类型,比如说我到时候要通过Next
拿到下一个数据对象怎么拿,所以我们只能通过这个类拿。
3.测试Node类加强理解
public static void main(String[] args) {
newNode node1 = new newNode("数据对象1"); //创建数据对象1 没有上下指向
System.out.println(node1.toString());
}
*输出结果:数据对象1
现在我们就要用到我们的Next和prev
属性,我这里就只演示单向的,用到Next
属性,这个理解了,其他的顺其自然懂了。
public static void main(String[] args) {
newNode node1 = new newNode("数据对象1"); //创建数据对象1 向下执行node2
newNode node2 = new newNode("数据对象2"); // 创建我们的数据对象2
node1.Next = node2; // node1的向下指向为node2
/*
如果是双向的 则node2的prev指向 node1
即:node2.prev = node1;
*/
System.out.println(node1.Next.toString());
}
*输出结果:数据对象2
这个时候就有问题了:如果我在node1和node2
之间插入一个node3
该如何办 ?
public static void main(String[] args) {
newNode node1 = new newNode("数据对象1"); //创建数据对象1 向下执行node2
newNode node2 = new newNode("数据对象2"); // 创建我们的数据对象2
newNode node3 = new newNode("数据对象3"); // 创建我们的数据对象3
node1.Next = node3;
node3.Next = node2;
System.out.println(node1.Next.toString());
}
*输出结果:数据对象3
是不是很简单,调动位置就行了,修改node1
的指向为node3
,node3
再向下指向node2
内容不多,但是篇幅较长,代码较多,也是为了能够更好的理解我们的链表结构,不难把,那么链表以及我们到时候写LinkedList
要用到的Node类
就告一段落了。
二、 过程中可能会不熟悉的代码
这里也是我之前不太能理解的代码,在这里分享一下。
1. transient关键字
如果被这个关键字修饰的属性,那么在序列化的过程中,这个属性将不参与序列化的过程,并且结果会是null
2. 泛型 <? extends E>
这样定义泛型是不是不太容易理解,关于其中的?
的理解,?
就是我们泛型中的通配符
,通配符是啥?也就是可以代表任意的符号比如字符、数字。其实这个我在之前看一本书的时候看过,所以在此附上《Effective Java(中文版第3版)》,可以去“java1234“这个网站搜索下载,里面有一章节就是专门讲泛型的。
而<? extends E>
这句代码所代表的的是 “用来限制元素的类型的上限”
举个例子
<? extends Animals>
就是类型的上限为Animals
,不能是它的父类,只能是他下面的子类
和本身。
举一反三,相反的还有我们的这个<? super Animals>
就是类型的下限了,也就是我们的类型最低是我们的Animas
l及它的父类
。
- 人山人海你我相遇,感恩缘分。
- WeChat:lljb1218
以上是关于手写集合框架LinkedList准备篇的主要内容,如果未能解决你的问题,请参考以下文章
jdk源码阅读笔记之java集合框架(LinkedList)