文章目录
基础部分
-
String,StringBuffer,StringBudilder 的区别
1.String 是个不可改变的常量,是线程安全的适合操作少量数据;
2.StringBuffer 可变的变量,线程安全;
3.StringBudilder 可变的变量,线程不安全,性能比StringBuffer 强; -
hashtable和hashmap的区别是什么
- hashtable: 线程安全,不允许有null的键和值;
- hashmap: 线程不安全,允许有null的键和值,是hashtable的轻量级实现,效率比hashtable高;
-
list,set,map的区别
- list:元素有放入顺序,元素可重复
- set: 无放入顺序,元素不可重复
- map: 使用key-value结构,key不可重复但是value可以重复
-
abstract(抽象类) 和 interface(接口)的区别
- 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
- 抽象类要被子类继承,接口要被类实现。
- 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
- 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
- 抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
- 抽象类里可以没有抽象方法
- 如果一个类里有抽象方法,那么这个类只能是抽象类
- 抽象方法要被实现,所以不能是静态的,也不能是私有的。
- 接口可继承接口,并可多继承接口,但类只能单根继承。
-
final 的用途
- 被final修饰的类不可以被继承;
- 被final修饰的方法不可以被重写;
- 被final修饰的变量不可以被改变;
设计模式
-
单列模式
-
懒汉式
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
-
饿汉式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
-
Spring(Spring 一统天下)
Spring事物
Spring事物隔离级别
隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量
- TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED;
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。
- TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
- TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。
- TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
Spring事务传播行为
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量
- TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
- TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
Spring-AOP
AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译 方式和运行期动态代理实现程序功能的统一维护的一种技术。
- 主要功能
- 日志记录,性能统计,安全控制,事务处理,异常处理等等
- 主要意图
- 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划 分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
Spring-IOC
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。
在Java中依赖注入有以下三种实现方式:
- 构造器注入
- Setter方法注入
- 接口注入
bean的循环依赖问题
Springmvc 中 DispatcherServlet 初始化过程
DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,而且与spring IOC容器无缝集成,从而可以获得Spring的优势。
- 文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
- 通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
- 通过handlerAdapter支持多种类型的处理器(handlerExceptionChain中的处理器);
- 通过ViewResolver解析逻辑视图名到具体视图实现;
- 本地化解析;
- 渲染具体的视图等;
- 如果执行过程中遇到异常将交给handlerExceptionResolver来解析;
SpringBoot比Spring做了哪些改进
- 独立运行
- 简化配置
- 自动配置
- 无代码生成和 XML 配置
- 应用监控
- 上手容易
数据库
MySQL数据库引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。
- InnoDB存储引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。 - MyISAM存储引擎
- MEMORY存储引擎
MyISAM和InnoDB的特点
MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:
- 不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁;
- 不支持事务;
- 不支持外键;
- 不支持崩溃后的安全恢复;
- 在表有读取查询的同时,支持往表中插入新纪录;
- 支持BLOB和TEXT的前500个字符索引,支持全文索引;
- 支持延迟更新索引,极大提升写入性能;
- 对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用;
InnoDB在MySQL 5.5后成为默认索引,它的特点是:
- 支持行锁,采用MVCC来支持高并发;
- 支持事务;
- 支持外键;
- 支持崩溃后的安全恢复;
- 不支持全文索引;
总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表。
什么是索引
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。 重点:索引是一种有顺序的存储结构
各种连接查询
- 内连接(INNERJOIN):当两个表中都存在匹配时,才返回行。
- 左连接(LEFTJOIN):返回左表中的所有行,即使右表中没有匹配的行。
- 右连接(RIGHTJOIN):返回右表中的所有行,即使左表中没有匹配的行。
- 全连接(FULLJOIN):只要某一个表存在匹配,就返回行。
- 笛卡尔连接(CARTESIANJOIN):返回两个或者更多的表中记录集的笛卡尔积。