Java阶段复习

Java基础

数组

一组连续空间,存储多个相同类型的值

特点

  • 数据类型相同
  • 长度固定

数组的扩容

  • 创建一个新数组,使用For循环将元素逐一赋值
  • System.arraycopy(原数组名,原数组起始下标,新数组名,新数组起始下标,复制的长度)
  • Java.util.Arrays.copyOf(原数组名,新数组名)

排序

  • 冒泡(相邻两个元素两两比较,互换位置)
  • 选择(固定值和其他值依次比较,互换位置)
  • 快速

查找

  • 二分法查找【递归】

静态&最终&抽象

静态static

简述

  • 可以修饰属性和方法
  • 修饰属性——>静态属性(类属性)
  • 修饰方法——>静态方法(类方法)
  • 静态成员全类所有对象共享
  • 全类就一份,不会因为创建多个对象而产生多份
  • 不必创建对象,直接通过类名进行访问

特点

  • 静态方法可以直接访问静态成员
  • 静态方法不能直接访问非静态成员
  • 可以继承,没有覆盖和多态

抽象Abstract

简述

  • 修饰类——>称为抽象类,无法New对象
    • 作用
      • 为子类提供共性的属性和方法
      • 可以声明引用,强制使用多态(分类引用指向子类对象)
  • 修饰方法——>称为抽象方法,无法直接使用
    • 作用
      • 强制子类覆盖父类中所有的抽象方法,如果不覆盖,该类必须声明为抽象类

最终Final

简述

  • 修饰类——>没有子类
  • 修饰方法——>可以继承,不能覆盖
  • 修饰变量——>只能赋值一次,不能改变,修饰变量我们称之为常量
    • 实例变量:没有默认值,必须手动赋值,赋值的时机:
      • 显示初始化
      • 动态代码块
      • 每一个构造方法
    • 静态变量:没有默认值,必须手动赋值,赋值的时机:
      • 显示初始化
      • 静态代码块
    • 局部变量
      • 基本数据类型:数值不可变
      • 引用数据类型:地址不可变

类加载过程

https://blog.csdn.net/romantic_jie/article/details/91355437

JVM原理&调优【重点】

略(后面详细介绍)

Object类

所有的父类,如果没有显示继承,那么隐式存在

作用

  • 作为形参——>可以接受所有对象
  • 作为返回值类型——>可以返回所有对象
  • Java中每一个对象多可调用Object类中的方法

Object类常用的方法有哪些低于5个)

  • hashCode toString getClass equals wait notify notiyAll clone fianlize等

集合

简述

Java集合类存放在java.util包中,是一个用来存放对象的容器。

注意:

  • 1.集合只能存放对象。比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。
  • 2.集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。
  • 3.集合可以存放不同类型,不限数量的数据类型。

集合和数组的区别

  • 长度
    • 数组不可变
    • 集合可变
  • 元素的数据类型
    • 数组可以存储基本类型数据和引用数据类型
    • 集合只能存储引用数据类型

集合类原理,尤其HashMap、HashTable、ConcurrentHashMap等

  • HashTable: KV都不允许为null,线程安全,效率低

  • HashMap(和HashTable相反):哈希表()、链表( 解决哈希冲突)、红黑树( 解决链表过长,效率过低问题)

  • ConcurrentHashMap:1.7版本之前 哈希表 + 链表 + 分段锁 1.8以后 哈希表 + 链表 + 红黑树

    CAS(Compare And Set): 类似于乐观锁

面试题/h3>

List下有三个实现类的特点

set集合

HashSet

Map和Colleciton区别

IO

分类

  • 方法:输入流和输出流
  • 功能:节点流和过滤流
  • 单位:字节流和字符流

使用

对象序列化和反序列化

网络中传输的数据均为字节,保证数据能够进行网络传输

  • 实现序列化接口
  • 不需要参与对象的序列化

BIO、NIO、AIO/h3>
  • BIO:同步阻塞IO

  • NIO:同步非阻塞IO Netty

  • AIO:异步非阻塞IO

    网络编程

    阻塞和非阻塞体现在线程利用率

    阻塞:先有线程再有完整的IO操作,线程服务于一次完整的IO

    非阻塞:关注的事件,事件发生后进行事件操作,线程利用率更高

    同步和异步

request.getInputStream

线程

  • 进程:正在运行的程序。

  • cpu:单cpu一个时间点只能执行一个进程。

    • 为什么我们感觉多个进程是同时执行的/li>
    • 是因为cpu在做着程序之间的高效切换,让我们感觉是同时在执行。
  • 线程:在一个进程中,包含多个任务,而每一个任务就是一个线程。

  • 多线程:每一个进程想要执行必须抢到cpu才能执行,如果一个进程中线程的数量比较多,那么该进程抢到的概率就更大,但是不保证一定抢到,因为线程的执行是随机性的。

  • 并发:在一段时间内多个线程切换执行。

  • 并行:在一个时间点多个线程同时执行。

创建

  • extend Thread
  • implements Runnable
  • 线程池

运行状态

  • 初始化状态
  • 就绪状态 thread.start()
  • 运行状态
  • 阻塞状态 sleep(不会释放锁) | wait(释放锁标记)
  • 死亡状态

线程安全

多线程并发环境中操作临界资源,保证线程的安全,对临界资源加锁

同步锁

  • 同步方法
  • 同步代码块

线程池

将需要执行的任务交给线程池,线程池会分配线程去执行该任务,任务执行结束线程不会死亡,而是回到线程池中处于空闲状态,等待下一个任务。

  • FixedThreadPool
  • CachedThreadPool

反射

类对象

通过.class文件获取的对象,使用该对象中的构造方法,实例变量,实例方法。

  • getClass
  • Class.forName(推荐(将来可以将字符串写入到配置文件中))
  • 对象.class

使用

  • 反射调用方法、属性

设计模式

  • 单例(静态内部类)

    保证内存中只有一个对象

    • 私有属性方法
    • 本类提供一个对象
    • 将该类对象提供给外界使用
  • 工厂(好处 : 解耦合)

    主要解决的是对象创建的问题,工厂的职责在于创建一个对象

  • 代理(静态代理、动态代理)

    客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。

  • 适配器

    将一个类的接口转成客户期望的另外一个接口,使得原本由于接口不匹配而不能一起工作的那些类可以一起工作。

  • 责任链

    当系统需要嵌入多个独立功能模块时,可以使用责任链设计模式

    • :主要负责实际功能实现。
    • :用于协调责任调度,记录调度状态。

网络

TCP/IP协议的三次握手和四次挥手

https://blog.csdn.net/qq_38950316/article/details/81087809

网络七层模型

  • 应用层 Http
  • 会话层
  • 表示层
  • 传输层 TCP/UDP 报文
  • 网络层
  • 数据链路层
  • 物理层

JavaWEB框架复习

Java 语法基础:HashMap结构,锁-分类,JVM GC策略,自定线程池参数含义,JVM内存分析指令-jmap,jstack,jstats, Java类加载策略,网络编程 阻塞IO和NIO – 高级Java开发工程师

Spring

概念:一款轻量级javaEE解决方案,众多优秀设计模式的组合

IOC(控制反转)

控制:给属性赋值的权利

反转:把给属性赋值的权利由代码反转到了配置文件中

控制反转,有容器工厂负责对象的创建销毁(生命周期)

或者

DI(依赖注入)

当一个类型需要另一个类型时,可以把另一个类型作为该类型的属性,通过对应的注入方式进行赋值

、和

AOP(面向切面编程)

将代码中其它功能(事务、日志、性能等)剥离出来形成独立的功能方法或者功能类,如果使用到这些功能时,通过动态代理方式生成代理类,增强普通类功能

动态代理(字节码处理技术): 原始方法 + 额外功能 = 代理类

  • JDK(默认):必须提供接口
  • CGLIB(基于父子类继承关系):可以是接口也可以是普通类

使用

  • 基于接口
  • 基于注解: 和等

切入点表达式

  • 通用表达式:

事务传播属性

解决事务嵌套问题

  • SUPPORT(support):支持当前事务,如果无事务环境则以无事务方式运行
  • REQUIRED(required):必须有事务,如果有事务则使用当前事务,如果无新建事务
  • NOT_SUPPORT:外部有事务则挂起(以非事务的形式执行)
  • MANDATORY(mandatory):外部必须有事务,没有事务就报错
  • NEVER:外部必须没有事务,有事务报错

1.PROPAGATION(propagation)_REQUIRED – 如果存在当前事务则用当前事务;如果不存在当前事务,就新建一个事务。这是最常见的选择。

2.PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。

3.PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。

4.PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。开启一个新事务,新事务执行完毕后,唤醒之前挂起的事务,继续执行。如果不存在当前事务,则新建一个事务

5.PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6.PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。

7.PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

隔离属性

脏读: 一个事务读取了另一个事务尚未提交的数据

isolation=“READ_COMMITTED” 解决脏读问题

不可重复读:多次读取到的数据不一致

isolation=“REPEATABLE(repeatable)_READ” 解决不可重复读问题

幻影读:多次统计的结果不一致

isolation=“SERIALIZABLE(serializable)” 解决幻影读问题

安全:SERIALIZABLE>REPEATABLE_READ>READ_COMMITTED

性能:READ_COMMITTED>REPEATABLE_READ>SERIALIZABLE

isolation=“DEFAULT” 根据数据库默认隔离属性定

Oracle数据库隔离属性级别: READ_COMMITTED

Mysql数据库隔离属性级别: REPEATABLE_READ

传播属性 (补充)

作用:解决事务嵌套问题

propagation=“REQUIRED” 默认值 当外部有事务则融入到外部事务中,如果外部没有事务,则开启新的事务 (增删改)

propagation=“SUPPORTS” 当外部有事务则融入到外部事务中,如果外部没有事务,也不开启事务(查)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5L3l4to-1586439809864)(D:java168java168三阶段资料框架阶段SpringSpring-Day4图片传播属性补充.png)]

只读属性

read-only=false 默认值 (增删改)

read-only=true 查询(提高查询效率)

超时属性

作用:决定释放锁标记的等待时长

time-out=-1 由数据库来决定

异常属性

作用:哪些异常进行提交些异常进行回滚/p>

默认对于未检查异常进行回滚操作,对已检查异常进行提交操作

rollback-for 指定哪些异常进行回滚操作

no-rollback-for 指定哪些异常进行提交操作

总结:实战开发中事务属性的应用

增删改: isolation=“default” propagation=“REQUIRED” read-only=“false” time-out=”-1″

异常属性默认 (全部用默认)

查询: isolation=“default” propagation=“SUPPORTS” read-only=“true” time-out=”-1″

异常属性默认

Spring工厂创建对象的生命周期

对象什么时候被创建/strong>

对象只创建一次时(scope=“singleton”):工厂被创建则对象被创建 饿汉式
对象每次创建新的(scope=“prototype”): 该对象使用时被创建 懒汉式

对象什么时候被销毁/strong>

工厂关闭时,对象被销毁 但是还与垃圾回收机制有关
init-method 指定对象创建调用的初始化方法
destory-method 指定对象销毁调用的销毁方法

SSMSpring+Struts2+Mybatis)注解版

作用:替换配置文件中,复杂的配置

开发步骤:

1.把注解放置对应的位置上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6e0pLf5-1586439809865)(C:Users战神AppDataRoamingTyporatypora-user-images1586434941807.png)]

2.告知Spring框架在哪一个包中使用了注解

常用注解:

  • @Component

    放置位置:类上

    作用:创建简单对象

    注意:默认提供ID 类名首字母小写

  • @Service

    位置:Service实现类上

    作用:创建Service实现类对象

  • @Autowired

    位置:属性上

    作用:为属性做自动注入

    前提:在Spring工厂中必须有为该属性注入的值

  • @Transactional

    位置:方法 类

    作用:为方法添加对应的事务

    前提: 必须激活该注解

  • @Controller

    位置:类

    作用:自动创建Action对象

  • @Scope

    位置:类

    作用:决定对象创建的次数

    singleton 只创建一次

    prototype 每次创建新的

开发步

1.建表

2.写实体

3.定义DAO接口

4.Mapper文件实现DAO接口

5.Spring配置文件中配置mybatis相关的内容

6.定义Service接口

7.实现Service接口

i.@Service 自动创建Service实现类对象

ii.@Autowired 自动为DAO属性做注入

8.配置额外功能事务

i.@Transactional 给对应的方法添加事务

9.开发Action

i.@Controller 创建Action对象

ii.@Scope 决定创建对象的次数

iii.@Autowired 自动注入Service实现类对象

10.struts.xml中配置

11.告知Spring框架在那一个包下使用了注解

SpringMVC

概念:是一款控制层的框架,解决MVC分层开发中控制层的问题

好处:

  • SpringMVC框架是Spring全家桶体系的组成部分,与Spring体系做到无缝衔接

  • SpringMVC无论从开发效率还是运行效率都比Struts2高

作用

1.接收数据

2.调用业务

3.跳转页面

SpringMVC中的基础语法

@RequestMapping注解

作用:

1.指定后台Action的访问路径

2.指定该方法被访问的请求方式

位置:

类 相当于struts2中的namespace

方法 相当于struts2中的name

RequestMethod.GET 该方法只能被GET方式访问

RequestMethod.POST 该方法只能被POST方式访问

method ={RequestMethod.POST,RequestMethod.GET} 既可以被POST方式又可以被GET方式访问 (默认)

@RequestParam注解

i.解决传入的键与形参名不一致的问题

ii.可以设置接收数据的默认值

@DateTimeFormat注解

@DateTimeFormat(pattern = “yyyy-MM-dd”) 自定义接收数据类型

Java阶段复习

SpringMVC流程

1、 用户发送请求至前端控制器DispatcherServlet。

2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet调用HandlerAdapter处理器适配器。

5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、 Controller执行完成返回ModelAndView。

7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、 ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

SpringBoot

介绍

简化Spring应用的初始搭建以及开发过程,内嵌WEB容器,提供自动配置,程序员只需要关注业务功能开发而不是Bean的配置;

springboot(微框架) = springmvc(控制器) + spring(项目管理)

特点

  1. 创建独立的Spring应用程序

  2. 嵌入的Tomcat,无需部署WAR文件

  3. 简化Maven配置

  4. 自动配置Spring

  5. 没有XML配置

Restful

软件设计风格

使用请求方式说明对资源操作;

自动配置

Spring4.0后提供配置注解

根据导入的依赖自动完成配置

切面编程

springboot是对原有项目中spring框架和springmvc的进一步封装,因此在springboot中同样支持spring框架中AOP切面编程,不过在springboot中为了快速开发仅仅提供了注解方式的切面编程.

相关注解
  • @Aspect 用来类上,代表这个类是一个切面
  • @Before 用在方法上代表这个方法是一个前置通知方法
  • @After 用在方法上代表这个方法是一个后置通知方法
  • @Around 用在方法上代表这个方法是一个环绕的方法
  • @order(数字)用在类上,数字越小进入越早

重点注解

参考: https://www.cnblogs.com/tanwei81/p/6814022.html

  • @RestController: 就是@Controller+@ResponseBody组合,支持RESTful访问方式,返回结果都是json字符串。
  • @ResponsrBody:返回Json数据
  • @Controller:用于定义控制器类
  • @Autowired:自动导入依赖的bean
  • @Service:修饰Server层的组件
  • @SpringBootApplication 注解等价于:
    • @Configuration 项目启动时自动配置spring 和 springmvc 初始搭建
    • @EnableAutoConfiguration 自动与项目中集成的第三方技术进行集成
    • @ComponentScan 扫描入口类所在子包以及子包后代包中注解(也可以从新指定要扫描哪些包)

MyBatis

优秀的持久层框架,对数据库进行访问和操作。

替换JDBC技术 —– 定制化SQL(动态SQL),高级映射关系,支持缓存。

核心组件

mybtis中代码的书写

JDBC —> 接口 Connection PreparedStatement ResultSet DrvierManager

Resources、SqlSessionFactory、SqlSession

Resources : 读取MyBatis的核心配置文件。

SqlSession : 类似连接Connection

  1. 将mapper.xml文件 转换成对应的DAO实现类(DAOImpl)

  2. 内部封装了Connection对象 使用SqlSession去访问数据库

  3. sqlSession.commit(); sqlSession.rollback();

SqlSessionFactory :SqlSession的工厂 用来创建SqlSession对象。

缓存机制

应用优化策略,提高访问效率,大大减轻数据库的访问负载

  • 一级缓存:SqlSession,缓存依赖于会话

  • 二级缓存:NameSpace级别,所有的查询语句都会进行缓存,在调用增删改方法时所有的查询缓存会失效;

    —> JVM

    —> 保存第三方存储系统(内存 分布式)

    基于Redis管理MyBatis二级缓存 构建分布式缓存服务;

Java阶段复习

动态SQL标签

MyBatis参数绑定机制

mapper文件中取值的语法: #{…} . ${} 存在SQL注入的风险 不建议使用

关系型数据库(MySQL)

Java阶段复习

基本SQL语法

DQL (Data Query Language) : 数据查询语言

DDL(创建表) : 数据的定义语言

DML(增删改) : 数据修改语言

  • 基本Select、Update、Insert、Delete
    • insert into 表名(列1,列2…) values (数据1,数据2…)
    • update 表名 set 列名=数据,列名=数据… where 条件
    • delete from 表名 where 条件
  • 函数使用max、min、avg、now等
  • 表连接查询
  • 数据库

事务 【重点】

ACID四大特性/h5>
  • 原子性:一个事务内,所有操作是一个不可分割的整体;
  • 一致性:事务操作前后对数据的影响是一致的
  • 隔离性:事务和事务的操作时隔离的,互不影响干涉;
  • 持久性:事务操作一旦提交,对数据库影响是不可逆的
事务问题/h5>

脏读(A事务读取到了B事务未提交的数据)

不重复读(A事务内多次读取同一条数据,结果不一致)

幻影读(A事务多次读取结果的条数不一致)

事务隔离级别/h5>
  • 读未提交:没有解决任何的事务问题
  • 读已提交:解决脏读,Oracle默认
  • 重复度:解决不可重复读,MySQL默认
  • 序列化读: 解决所有的事务问题;

等级:由低到高

效率:由高到低

事务传播属性/h5>

参考Spring

索引 【重点】

常用索引类型
  • 主键索引:约束,建议在查表时使用主键,因为这样做的话可以使用到主键索引

  • 唯一索引:约束

  • 复合索引:对多个字段创建一个索引;

  • 普通索引:单字段创建一个索引

索引方法
  • Hash

  • BTree

    https://blog.csdn.net/iteye_19269/article/details/82678056

视图(view)

简化SQL语句

数据库引擎 【重点】

  • Myisam 不支持事务和外键 适用于只读查询

  • Innodb 支持事务和外键 适用于读写查询

    https://www.cnblogs.com/wangsen/p/10863405.html

    https://www.cnblogs.com/klb561/p/10344364.html

存储过程 【一般】

https://www.runoob.com/w3cnote/mysql-stored-procedure.html

SQL优化

  • 尽可能利用索引查询

  • 尽量避免三张表以上的连接操作,可以使用子查询代替表连接

  • 查询利用条件查询,避免全表的扫表

  • 避免使用 ,建议使用字段方式

    总结:上网资料 + 理解

设计范式

一、二、三范式

总结资料

https://www.cnblogs.com/wenxiaofei/p/9853682.html

悲观锁和乐观锁

  • 乐观锁:数据改操作,查询当前数据的版本号,应用更改,再结束后再次查询版本号,如果版本号变化回滚事务,没有变化提交事务;

Struts2

解决现有MVC开发思想中 控制器的问题。 —> 替换Servlet技术

框架: framewrok 软件开发中的半成品!!!

解决了软件开发过程中的通用问题(代码冗余或设计的不合理),从而提高了开发效率。

Servlet(单例)

不能定义成员变量

Struts2(多例)

每一次请求访问都会创建一个全新的对象(构造方法被多次调用),可以定义成员变量

Struts2中的跳转

Servlet 中跳转 请求转发 / 重定向

forward: 一次请求使用request作用域传递数据,地址栏不发生改变。

redirect : 两次请求不能使用request作用域传递数据,地址栏发生改变。


Struts2 中依然保持这两种跳转方式,由原有的代码书写变成的Struts.xml的配置

来源:帝兮小哥哥

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年3月7日
下一篇 2020年3月8日

相关推荐