线性表——双端队列
1、双端队列(Deque)
双端队列是在头尾两端都能添加和删除元素的队列。即:
它可以在队头添加元素,也可以在队尾添加元素。
它可以在队头删除元素,也可以在队尾删除元素。
注:Deque是double ended queue的简称。
2、双端队列的设计
与队列类似,由于双端队列也是频繁地在队头和队尾添加或删除元素,因此我们也优先使用双向链表来实现双端队列。具体分析过程参见队列,这里不再赘述。
(1)类的结构设计
在编程之前,我们需要先对双端队列类(Deque)的结构进行设计。同样地,因为我们是直接利用双向链表来实现双端队列,所以我们可以通过“组合”的方式来实现双端队列。即:将双向链表类的对象定义成Deque类的私有成员变量。
**注:**我们之所以没采用“继承”(即:让Deque类直接继承双向链表类)的方式来实现双端队列,是因为如果Deque类直接继承双向链表类,那么它在继承双向链表特性的同时也会继承它的其他接口,从而破坏了Deque类封装的接口。
因此,双端队列类需要的成员主要包括:
私有成员变量:双向链表类的对象。
1private DoubleLinkedLis ...
线性表——队列
1、队列(Queue)
队列是一种特殊的线性表,它只能在头尾两端进行操作。
元素出入特点:
它只能在队尾入队(添加元素);
它只能在队头出队(删除元素)。
元素出入原则:先进先出。
2、顺序队列与链式队列
仔细观察可以发现,如果我们把队列内部元素按照入队的先后顺序依次存储在前面学习过的动态数组或链表中,那么元素的入队操作完全等价于在动态数组或链表的尾部添加元素,元素的出队操作完全等价于在动态数组或链表的头部删除元素。因此,我们可以直接利用动态数组或(双向)链表来实现队列。
**注:**如果频繁在头部进行添加、删除操作,建议使用双向链表。此时,动态数组的时间复杂度为O(n),双向链表的时间复杂度为O(1)。
基于数组实现的队列是顺序队列,基于链表实现的队列为链式队列。
由于队列需要频繁地在尾部添加元素和头部删除元素,因此我们优先使用双向链表来实现队列。
3、链式队列的设计
(1)类的结构设计
在编程之前,我们需要先对队列类(Queue)的结构进行设计。因为我们是直接利用双向链表来实现队列,所以我们可以通过“组合”的方式来实现队列。即:将双向链表类的对象定义成 ...
线性表——栈
1、栈(Stack)
栈是一种特殊的线性表,只能在一端进行操作。
**注:**这里说的“栈”与内存中的“栈空间”是两个不同的概念。这里说的栈是一种数据结构,而“栈空间”是内存的一种,两者虽然有一定的联系,但却是两个完全不同的概念。
栈的常见操作主要包括:
入栈(Push):往栈中添加元素。
出栈(Pop):从栈中移出元素。
**注:**只有栈顶元素可被移出。
元素出入原则:后进先出。
2、栈的设计
仔细观察可以发现,如果我们把栈内元素按照入栈的先后顺序依次存储在前面学习过的动态数组或链表中,那么元素的入栈和出栈操作完全等价于在动态数组或链表的尾部添加和删除元素。因此,我们可以直接利用动态数组或(双向)链表来实现栈。
**注:**如果频繁在尾部进行添加、删除操作,选择动态数组和(双向)链表均可。此时,两者时间复杂度均为O(1)。
(1)类的结构设计
在编程之前,我们需要先对栈类(Stack)的结构进行设计。因为我们是直接利用动态数组或(双向)链表来实现栈,所以我们可以通过“组合”的方式来实现栈。即:将动态数组类或(双向)链表类的对象定义成Stack类的私有成员变 ...
线性表——双向循环链表
1、双向循环链表(DoubleCircleLinkedList)
双向循环链表与双向链表的唯一区别是:双向循环链表尾节点的next指向头节点,构成了一个循环;双向循环链表头节点的prev指向尾节点,构成了另一个循环。
注:
循环链表虽然首尾相连,但并不表示该链表没有头节点和尾结点。
循环链表的头节点是第一个添加的节点,并不是环中的任意节点都可能是头节点。
2、双向循环链表的设计
(1)类的结构设计
在编程之前,我们需要先对双向循环链表类(DoubleCircleLinkedList)的结构进行设计。
双向循环链表类所需要的成员与双向链表类完全一样,主要包括:
链表存放元素的数量。
1private int size;
size = 元素(Element)数目 = 节点(Node)数目。
第一个节点的引用。
1private Node<E> first;
first指向链表的第一个(头)节点。
最后一个节点的引用。
1private Node<E> last;
last指向链表的最后一个(尾)节点。
内部静态节点(Node)类。
由于该节点类 ...
线性表——单向循环链表
1、单向循环链表(SingleCircleLinkedList)
单向循环链表与单向链表的唯一区别是:单向循环链表尾节点的next指向头节点,构成了一个循环。
注:
循环链表虽然首尾相连,但并不表示该链表没有头节点和尾结点。
循环链表的头节点是第一个添加的节点,并不是环中的任意节点都可能是头节点。
2、单向循环链表的设计
(1)类的结构设计
在编程之前,我们需要先对单向循环链表类(SingleCircleLinkedList)的结构进行设计。
单向循环链表类所需要的成员与单向链表类完全一样,主要包括:
链表存放元素的数量。
1private int size;
size = 元素(Element)数目 = 节点(Node)数目。
第一个节点的引用。
1private Node<E> first;
first指向链表的第一个节点。
内部静态节点(Node)类。
由于该节点类仅供链表类使用,因此,需将该节点类定义为链表类的内部类。该类的成员包括:
该节点内部的泛型元素
1E element;
泛型元素既可以是基本数据类型,也可以是类的对象。
下一个节点 ...
线性表——★(双向)链表
由于单向链表永远只能从头节点开始搜索,而双向链表既可以从前向后搜索又可以从后向前搜索。因此,使用双向链表可以提升链表的综合性能。
**注:**Java自带的java.util.LinkedList类就是一个双向链表。
1、双向链表(DoubleLinkedList)
与单向链表相比,双向链表具有以下特点:
双向链表类的成员既有指向头节点的指针first,也有一个指向尾节点的指针last。
双向链表的每个节点既包含一个指向下一节点的指针next,又包含一个指向上一节点的prev指针。
2、双向链表的设计
(1)类的结构设计
在编程之前,我们需要先对双向链表类(DoubleLinkedList)的结构进行设计。
双向链表类需要的成员主要包括:
链表存放元素的数量。
1private int size;
size = 元素(Element)数目 = 节点(Node)数目。
第一个节点的引用。
1private Node<E> first;
first指向链表的第一个(头)节点。
最后一个节点的引用。
1private Node<E> last;
...
SpringBoot详解2:Web开发
引言
接下来,我们开始学习Spring Boot的Web开发,从这一章往后,就属于我们实战部分的内容了。
其实Spring Boot的东西用起来非常简单,因为Spring Boot最大的特点就是自动装配。
使用Spring Boot的步骤:
1、创建一个Spring Boot应用,选择我们需要的模块,Spring Boot就会默认将我们的需要的模块自动配置好
2、手动在配置文件中配置部分配置项目就可以运行起来了。
3、专注编写业务代码,不需要考虑以前那样一大堆的配置了。
要熟悉掌握开发,之前学习的自动配置原理一定要搞明白!
比如:Spring Boot到底帮我们配置了什么?我们能不能修改?我们能修改哪些配置?我们能不能扩展?
**自动配置类( xxxAutoconfiguration):**向容器中自动配置组件(Bean)。
属性配置类(xxxProperties):封装(properties或yaml)配置文件的内容,供自动配置类使用。
没事就找找类,看看自动装配原理!
我们之后来进行一个单体项目的小项目测试,让大家能够快速上手开发!
附:搭建Spring Boot开发环境
参见 ...
SpringBoot详解1:核心技术
1、Spring Boot简介
1.1、回顾什么是Spring
Spring是一个开源框架,2003年兴起的一个轻量级的Java开发框架,作者:Rod Johnson(音乐学博士)。
Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。
1.2、Spring是如何简化Java开发的
为了降低Java开发的复杂性,Spring采用了以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程,所有东西都是bean;
2、通过IOC,依赖注入(DI)和面向接口实现松耦合;
3、基于切面(AOP)和惯例进行声明式编程;
4、通过切面和模版减少样式代码,RedisTemplate,xxxTemplate。
1.3、什么是Spring Boot
学过javaweb的同学就知道:开发一个web应用,从最初开始接触Servlet结合Tomcat,跑出一个Hello Wolrld程序,是要经历特别多的步骤;后来就用了框架Struts,再后来是SpringMVC,到了现在的Spring Boot,过一两年又会有其他web框架出现;你们有经历过框架不断的演进,然后自己开发项目所有的技术也在不断 ...
SpringMVC详解
1、回顾MVC
1.1、什么是MVC
参见《MVC三层架构》
MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
MVC是将业务逻辑、数据、显示分离来组织代码的。
MVC主要作用是降低了视图与业务逻辑间的双向偶合。
MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC架构之间也存在一些差异。
**(1)Model(模型):**数据模型,提供要展示的数据,包含数据和行为。我们一般将Service(业务)层、DAO(持久)层和JavaBean统称为Model。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
**(2)View(视图):**负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
**(3)Controller(控制器):**接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。Controller的底层都是通过Servlet来实现的。
最典型的MVC就是JSP + servlet + javabean的模式。
1.2、Web ...
Spring详解
1、Spring简介
1.1、概述
Spring : 春天,它给软件行业带来了春天。现代化Java的开发,就是基于Spring的开发!
2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。
2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。
很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
Spring理念 : 让现有技术更容易使用。它本身就是一个大杂烩,也是一种融合剂。它整合了现有的框架技术。
官网 : http://spring.io/
中文文档:https://www.docs4dev.com/docs/zh/spring-framework/5.1.3.RELEASE/reference
官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-pr ...