总结

目录

关系数据模型与对象模型

关系数据模型与对象模型之间的匹配关系:

  • 表对应类
  • 记录对应对象
  • 表的字段对应属性

面向对象的五大特征

  • 接口隔离原则
  • 依赖倒置原则
  • 单一职责原则
  • 开放封闭原则
  • 里氏替换原则

Exception

抛InterruptedException的代表方法

  • wait方法
  • sleep方法
  • join方法
    调用wait方法必须使用try catch或者自己抛出InterruptedException

方法的重载

方法的重载是指:

  • 在同一个类中
  • 方法名相同
  • 方法的形参列表不同(类型,顺序,个数)
  • 与方法的返回值类型和访问权限无关

Spring的事务传播特性

a) 传播行为定义了被调用方法的事务边界

传播行为意义
PROPERGATION_MANDATORY强制:表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常
PROPAGATION_NESTED表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样
PROPAGATION_NEVERnever:表示方法不能运行在一个事务之中
PROPAGATION_NOT_SUPPORTED表示方法不能在一个事务中。存在事务的话将被挂起
PROPAGATION_REQUIRED表示该方法需要在一个事务中,如果没有事务则创建一个事务
PROPAGATION_REQUIRES_NEW表示该方法需要运行在自己的事务中,没有事务则创建事务有的话则事务挂起
PROPAGATION_SUPPORTS表示该方法可以运行在事务中,但是如果没有事务,则就按照非事务方式进行

SpringMvc的执行流程

流程图

在这里插入图片描述
1.用户发送请求到前端控制器DispatchServlet
2.DispatchServlet收到请求调用HandlerMappering
3.HandlerMappering找到具体对应的控制器,返回到DispatchServlet
4.DispatchServlet调用HandlerAdapter处理器适配器
5.调用具体的处理器(Controller)
6.返回ModelAndView
7、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
9、ViewReslover解析后返回具体View(视图)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。

JVM方面

Java实现了真数组,避免了数据覆盖的可能。

JVM的几个区域

  • 新生代:所有对象创建在新生代的Eden区,当Eden区满后触发Minor GC,将Eden区和非空闲Survivir区存活的对象复制到另一个Survivor区中。保证一个Survivor区是有空间的两个Survivor区域互相复制,直到满载
  • 老年代:当两个Survior区域都满了之后复制到老年代区域中,老年代满载了将会触发Full GC,针对整个堆(新生代,老年代,持久代)进行回收
  • 持久代 : 持久代如果满载了会触发GC
  • 运行时常量池 : JDK1.8之前被放在了方法区,属于线程共享,1.8之后,元空间取代了方法区,运行时常量池大小受到了方法区大小的影响,存放了编译时候的各种字面量。存放了编译时期生成的各种符号

JVM内存区域

  • 程序计数器:一块较小的内存空间,他的作用可以看作是当前线程所执行的字节码的信号偏移位置,每一个线程有一个独立的程序计数器,因为当执行语句时,改变的是程序计数器的内存空间,因此不会发生程序溢出。
  • java虚拟机栈:线程私有

JVM虚拟映像

1、jps:查看本机java进程信息。

2、jstack:打印线程的栈信息,制作线程dump文件。

3、jmap:打印内存映射,制作堆dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具

6、jconsole:简易的可视化控制台

7、jvisualvm:功能强大的控制台

JVM区域

-Xmx10240m:代表最大堆
-Xms10240m:代表最小堆
-Xmn5120m:代表新生代
-XXSurvivorRatio=3:代表Eden:Survivor = 3 根据Generation-Collection算法(目前大部分JVM采用的算法),一般根据对象的生存周期将堆内存分为若干不同的区域,一般情况将新生代分为Eden ,两块Survivor; 计算Survivor大小, Eden:Survivor = 3,总大小为5120,3x+x+x=5120 x=1024
新生代大部分要回收,采用Copying算法,快!
老年代 大部分不需要回收,采用Mark-Compact算法

一个对象的一生:开始出生在Eden中,然后过了很久去到Suvivor区的from区,有时候在from区有时候在to区

堆区:只存放类对象,new出来的
方法区:静态存储区,存放class文件和静态数据
栈区:存放方法局部变量,基本类型变量

JVM算法回收

收集器算法
Serial New收集器是针对新生代的收集器复制算法
老年代收集器标记整理
cms标记清理

JVM区域

在这里插入图片描述
JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) , VM Stack(虚拟机栈)和Native Method Stack (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。

JVM区域线程是否共享
方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据线程共享
Heap 堆线程共享
虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息线程隔离
程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行线程隔离

解决哈希冲突

java8中:

方法
ThreadLocal开放地址法解决哈希冲突
HashMap链地址法

静态方法

静态成员随类的加载而加载,这个时候对象都还没有,this代表当前对象,所以this不能用于static方法中

序列化与反序列化

1.序列化是将数据转为n个 byte序列的过程
2.反序列化是将n个 byte转换为数据的过程

Java7

abstract class和interface有什么区别?
1.抽象类可以有构造方法,接口中不能有构造方法
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.一个类可以实现多个接口,但只能继承一个抽象类

Servlet

Servlet的体系结构

forward 与 redirect的区别

forwardredirect
地址栏forward是服务器请求资源,服务器直接访问资源的URL,然后直接传给浏览器,浏览器不知道是从什么地方来的,所以地址还是原来的redirect 是服务端根据逻辑,发送一个状态码告诉浏览器去重新请求这个地址
数据共享可以共享request之中的数据不能共享数据

Servlet生命周期

Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载
1.加载:容器通过类加载器使用servlet容器加载servlet
2.创建:通过调用servlet函数创建servlet对象
3.使用init方法初始化
4.处理请求:通过service方法。每有一个请求创建一个进程处理:doget/dopost
5.卸载:调用destroy销毁
在这里插入图片描述

线程释放锁资源

操作释放与否
sleep不释放
wait释放
join释放
yield不释放

并发

API | 功能
CopyOnWriteArrayList | 适合写少读多的场景
ReadWriteLock | 适合读多写少的的场景

synchronized

修饰非静态方法 锁的是this 对象

修饰静态方法 锁的是class对象

线程安全

线程安全即线程同步:喂,SHE
喂:V : Vector
S: Stack
H : HashTable
E : enumeration

多线程

A.子进程得到的是除了代码段是与父进程共享以外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,子进程可获得父进程的所有堆和栈的数据,但二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行;进程的线程之间共享由进程获得的资源,但线程拥有属于自己的一小部分资源,就是栈空间,保存其运行状态和局部自动变量的。
B.线程之间共享进程获得的数据资源,所以开销小,但不利于资源的管理和保护;而进程执行开销大,但是能够很好的进行资源管理和保护。
C.线程的通信速度更快,切换更快,因为他们共享同一进程的地址空间。
D.一个进程可以有多个线程,线程是进程的一个实体,是CPU调度的基本单位。

线程中断

中断线程的方法:
1.Java中一般通过interrupt方法中断线程
2.调用wait方法会让线程进入阻塞状态

循环优化

一些循环优化的方法:复写传播,删除死代码,归纳变量删除,代码外提,强度削弱

Spring知识点

什么是依赖注入?

依赖注入就是不需要本身创建对象,通过对容器的配置,让容器帮我们进行对象的创建。

依赖注入的方式?

1.构造方法注入
2.setter注入
3.接口注入
tips:在Spring中仅仅有构造方法注入和setter注入

setter注入和构造器注入的区别

构造函数注入setter注入
没有部分注入有部分注入
不会覆盖setter属性会覆盖setter属性
任意修改都会创建一个新实例任意修改不会创建一个新实例
适用于设置很多属性适用于很少属性

两个IOC容器的区别

BeanFactoryApplicationContext
使用懒加载使用及时加载
它使用语法显示提供资源对象它自己创建和管理资源对象
不支持国际化支持国际化
不支持基于依赖的注解支持基于依赖的注解

IOC的好处

  1. 它可以减少一定的代码量
  2. 它可以降低耦合度
  3. 便于测试
  4. 它支持即使的实例化和懒加载

SpringBean

什么是SpringBean
  • 他们是构成应用程序的主干
  • 通过IOC容器进行管理
通过什么方式配置Bean
  • 基于XML方式
    例如:
  • 基于注解的方式:默认IOC容器未开启注解。所以需要手动开启注解权限
  • 基于Java API来实现: 主要是通过@Bean和@Configuration来实现

AOP

什么是AOP?

AOP即面向切面编程,它与面向对象编程OOP相辅相成。在OOP中我们以一个类Class作为基本单元。而AOP中我们则是以一个切面作为一个基本单元。

什么是Aspect?

Aspect是由pointcut和advice组成。它既包含了横切逻辑的定义,又包含了连接点的定义。AOP就是负责实施切面的框架,他将切面定义的横切逻辑编织到连接点中。AOP 的工作重心在于如何将增强编织目标对象 的连接点上, 这里包含两个工作:

  • 如何通过pointcut和advice定位到特定的joinpoint上
  • 如何在advice上写切面代码

AOP有哪些实现方式

实现AOP主要有两大类方式实现。

  1. 静态代理 : 指使用aop框架的命令进行编译,从而在编译期间就可生成AOP代理类,因此也被称作编译期增强、
  2. 动态代理:运行时增强。JDK动态代理,CGlib

SpringAop和AspectJ AOP有什么区别?

springaop基于动态代理实现,aspectj基于静态代理

如何理解Spring中的代理

将Advice应用于目标对象后创建的对象称为代理,在客户端对象的情况下,目标对象和代理对象是相同的

Advice + Target Object = Proxy

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • List item
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值