个人小结
目录
关系数据模型与对象模型
关系数据模型与对象模型之间的匹配关系:
- 表对应类
- 记录对应对象
- 表的字段对应属性
面向对象的五大特征
- 接口隔离原则
- 依赖倒置原则
- 单一职责原则
- 开放封闭原则
- 里氏替换原则
Exception
抛InterruptedException的代表方法
- wait方法
- sleep方法
- join方法
调用wait方法必须使用try catch或者自己抛出InterruptedException
方法的重载
方法的重载是指:
- 在同一个类中
- 方法名相同
- 方法的形参列表不同(类型,顺序,个数)
- 与方法的返回值类型和访问权限无关
Spring的事务传播特性
a) 传播行为定义了被调用方法的事务边界
传播行为 | 意义 |
---|---|
PROPERGATION_MANDATORY | 强制:表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常 |
PROPAGATION_NESTED | 表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样 |
PROPAGATION_NEVER | never:表示方法不能运行在一个事务之中 |
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的区别
– | forward | redirect |
---|---|---|
地址栏 | 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容器的区别
BeanFactory | ApplicationContext |
---|---|
使用懒加载 | 使用及时加载 |
它使用语法显示提供资源对象 | 它自己创建和管理资源对象 |
不支持国际化 | 支持国际化 |
不支持基于依赖的注解 | 支持基于依赖的注解 |
IOC的好处
- 它可以减少一定的代码量
- 它可以降低耦合度
- 便于测试
- 它支持即使的实例化和懒加载
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主要有两大类方式实现。
- 静态代理 : 指使用aop框架的命令进行编译,从而在编译期间就可生成AOP代理类,因此也被称作编译期增强、
- 动态代理:运行时增强。JDK动态代理,CGlib
SpringAop和AspectJ AOP有什么区别?
springaop基于动态代理实现,aspectj基于静态代理
如何理解Spring中的代理
将Advice应用于目标对象后创建的对象称为代理,在客户端对象的情况下,目标对象和代理对象是相同的
Advice + Target Object = Proxy
FLowchart流程图
我们依旧会支持flowchart的流程图:
- List item
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。