手写集合框架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的指向为node3node3再向下指向node2

内容不多,但是篇幅较长,代码较多,也是为了能够更好的理解我们的链表结构,不难把,那么链表以及我们到时候写LinkedList要用到的Node类就告一段落了。

二、 过程中可能会不熟悉的代码

这里也是我之前不太能理解的代码,在这里分享一下。

1. transient关键字

如果被这个关键字修饰的属性,那么在序列化的过程中,这个属性将不参与序列化的过程,并且结果会是null

2. 泛型 <? extends E>

这样定义泛型是不是不太容易理解,关于其中的?的理解,?就是我们泛型中的通配符,通配符是啥?也就是可以代表任意的符号比如字符、数字。其实这个我在之前看一本书的时候看过,所以在此附上《Effective Java(中文版第3版)》,可以去“java1234“这个网站搜索下载,里面有一章节就是专门讲泛型的。
<? extends E> 这句代码所代表的的是 “用来限制元素的类型的上限”
举个例子
<? extends Animals> 就是类型的上限为Animals,不能是它的父类,只能是他下面的子类和本身。
举一反三,相反的还有我们的这个<? super Animals>就是类型的下限了,也就是我们的类型最低是我们的Animasl及它的父类

  • 人山人海你我相遇,感恩缘分。
  • WeChat:lljb1218

原文地址:https://www.cnblogs.com/linjiab/p/12041770.html

时间: 2024-08-02 23:35:43

手写集合框架LinkedList准备篇的相关文章

手写集合框架LinkedList实现篇

<手写集合框架>LinkedList篇 嘿嘿嘿,拖延症犯了,这几天不怎么想写代码,所以趁没事干就写写了.进入正文 还是老套路嘻嘻嘻,因为我之前写了那个准备篇,对node已经描述的从差不多了,所以我就不过多描述了. 直接贴完代码强行解释一波 一.定义接口 public interface newList<T> { //定义泛型,因为Object可以存储任意类型,有时候我们需要 //用泛型 代替Object public void add(Object object); //集合的添加

(二)springMvc原理和手写springMvc框架

我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.  处理器映射器找到具体的处理器(可以根据xml配置.注解进行查找),生成处理器对象及处理器拦截器(如果有则

手写SpringMVC 框架

手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现了MVC 设计模式的web (表现层) 层框架,其高开发效率和高性能也是现在很多公司仍在采用的框架:除此之外,Spring 源码大师级的代码规范和设计思想都十分值得学习:退一步说,Spring Boot 框架底层也有很多Spring 的东西,而且面试的时候还会经常被问到SpringMVC 原理,一般

手写Spring框架,加深对Spring工作机制的理解!

在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越来越轻松,我们用 Spring Boot 分分钟可以新建一个Web项目. 记得自己刚开始工作的时候还是在用Servlet写Web项目,自己写数据库连接池,用原生JDBC操作数据库,好了不发散了.回到这篇文章的主题,今天通过手写Spring框架,帮大家深入了解一下Spring的工作机制,文中涉及的代码

手写springIoc框架

springIoc的底层实现原理 1.读取bean的XML配置文件 2.使用beanId查找bean配置,并获取配置文件中class地址. 3.使用Java反射技术实例化对象 4.获取属性配置,使用反射技术进行赋值 使用人家spring框架读取对象 创建实体 package com.itmayiedu.service; public class UserEntity { private String userId; private String userName; public UserEnti

自己动手写集合框架决心篇

网上有很多关于这些的内容,我今天写的原因,是为了记录一下自己的学习过程,顺便巩固一下过去的所学的,我想把这些当做我生活中的一部分,并一步步深入学习下去.并附上一句经典名言(基础不牢,地动上摇!) let's go!我们先来了解一下集合体系,向下看 学过了javase,对上面的大部分过内容应该都非常了解了,至少我们知道了集合的四大接口:collection.List.Set.Map,其中List和Set是属于Collection下的子接口.关于接口下面的实现类,不再过多阐述,另外还有两个要侧重了解

一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)

笔记整理者:王小草 笔记整理时间2017年2月24日 原文地址 http://blog.csdn.net/sinat_33761963/article/details/56837466?fps=1&locationNum=5 Tensorflow官方英文文档地址:https://www.tensorflow.org/get_started/mnist/beginners 本文整理时官方文档最近更新时间:2017年2月15日 1.案例背景 本文是跟着Tensorflow官方文档的第二篇教程–识别手

纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器. 代码实现.1.pom.xml文件,需要依赖的jar包. <dependencies> <!--Java语言操作Tomcat--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <arti

尝试手写orm框架

前言: 在使用各种的orm框架的过程中,菜鸟的我始终没有搞懂底层实现技术,最近刚好没事找了些视频和资料了解一点皮毛,想记录下,大家勿喷. 所谓的ORM(Object Relational Mapping) 对象关系映射 官方解释是通过使用描述对象和数据库之间映射的元数据,将面向对象程序的对象自动持久化到关系数据库中. 个人理解就是一个数据库访问的帮助类,可以让我们不用手写sql,就完成数据库的访问 使用的技术: 泛型.反射.特性.扩展 摸索步骤: step1 新建项目,建几个类库,大家熟悉的三层