目录

Spring

Mybatis

SpringBoot

Mysql

JavaSE

数组和集合

多线程并发

异常处理机制

IO流

反射机制

Vue

SpringCloud

Nginx

Redis

分布式

JavaWeb

设计模式

Maven


Spring

什么是spring?
spring是一个轻量级的ioc和aop容器的开源开发框架,简化企业级应用的开发,
常见的三种配置方式:
基于XML的配置,基于注解的配置,基于java的配置
spring的特点:
轻量,控制反转(IOC),面向切面的编程(AOP),容器,MVC框架,事务管理,异常处理

spring常用注解
@Autowired
@bean
@Configuration
@Value

Spring主要由几个模块组成:
SpringCore:核心类库,提供IOC服务
SpringContext:提供框架式的bean访问方式
SpringAop:Aop服务
SpringDAO:对JDBC的抽象,简化了数据访问异常的处理
SpringORM:对现有的ORM框架的支持
SpringWeb:提供基本的面向Web的综合特性
SpringMVC:提供面向Web应用的Model-View-Controller实现
依赖注入的方式有几种?
1.构造器注入 2.setter注入 3.注解注入

SpringMVC的组件:
1.前端控制器DispatcherServlet
2.处理器映射器HandlerMapping
3.处理器适配器HandlerAdapter
4.后端处理器Handler
5.视图解析器View resolver

MVC执行流程?
1.用户发送请求至前端控制器
2.前端控制器收到请求后调用处理器映射器
3.处理器映射器根据url找到具体的处理器生成处理器对象返回给前端控制器
4.前端控制器调用处理器适配器
5.处理器适配器调用Handler后端控制器
6.Handler执行完返回ModelAndView
7.处理器适配器将handler执行结果MAV返回给前端控制器
8.前端控制器将MAV传给视图解析器,视图解析器解析完返回View
9.前端控制器对View进行渲染
10.前端控制器响应用户

SpringMVC常用注解:
@requestMapping
@requestBody
@responseBody

谈谈对SpringAop的理解
面向切面编程,便于减少系统重复的代码,降低模块之间的耦合度,有利于未来的可拓展性和可维护性
aop是基于动态代理,代理的对象实现了某个接口,使用JDK动态代理,没有实现接口使用CGlib代理

SpringAOP和AspectjAOP的区别
SpringAOP是属于运行时增强,而Aspectj是编译时增强,SpringAOP是基于代理而Aspectj基于字节码操作

AOP中连接点和切入点的区别
连接点代表一个应用程序的某个位置,这个位置可以插入一个aop切面是应用程序执行AOP的位置
切入点是一个或者一组连接点通知将在这些位置执行,可以通过表达式或者匹配的方式指明切入点

什么是通知,哪些类型
在方法执行前后要做的动作,是程序执行时要通过SpringAOP框架触发的代码段
before 前置通知
after 后置通知
after-returning 当方法成功执行完执行的通知
after-throwing 方法抛出异常退出时执行的通知
around 在方法执行前后的通知

什么是IOC
ioc就是控制反转,创建对象的主动权交给Spring容器管理,由容器去创建和管理各个实例之间的依赖关系,对象与对象之间的松耦合
DI(依赖)注入:应用程序在运行时候依赖ioc容器来动态注入对象需要的外部资源
IOC注入的三种方式:构造器注入,setter注入,注解注入

SpringBean的生命周期:
实例化bean,设置对象属性,处理aware接口,beanpostprocessor,initializingBean和ini-method,DisposableBean,destroy-method
bean的生命周期:定义,初始化,调用,销毁

解释Spring支持的几种bean作用域
singleton,prototype,request,session,global-session

Spring基于xml注入bean的几种方式
set方法注入,构造器注入#通过index设置参数位置#通过type设置参数类型

Spring框架中用到哪些设计模式
工厂模式,单例模式,原型模式,迭代器模式,代理模式,适配器模式,观察者模式

事务的隔离级别
未提交读,提交读,可重复读,可串行化

事务的传播机制
PROPAGATION_REQUIRED  默认
PAOPAGATION_REQUIRE_NEW
PROPAGATION_NESTED
PROPAGATION_SUPPORTS
PROPAGATION_NOT_SUPPORTED
PROPAGATION_MANDATORY
PROPAGATION_NEVER

Spring事务实现方式
编程式事务管理,声明式事务管理

事务管理的优点
它为不同的事务API
提供了统一的编程模型。它为编程式事务管理提供了一个简单的API
而非一系列复杂的事务API,它支持声明式事务管理。它可以和Spring 的多种数据访问技术很好的融合。

事务三要素
数据源,事务管理器,事务应用和属性配置

事务注解的本质是什么
@transactional表明该方法要参与事务,配置相关属性来定制事务的参与方式和运行行为
如何实现一个IOC容器
1.配置文件配置扫描路径
2.递归包扫描获取.class文件
3.反射确定需要交给ioc管理的类
4.对需要注入的类进行依赖注入
三个类加载器
BootStrapClassLoader
ExtClassLoader
AppClassLoader

Mybatis

什么是mybatis
是一个ORM对象关系映射框架,内部封装JDBC不需要去处理加载驱动创建连接创建statement
mybatis的优点和缺点
优点: 基于sql语句编程,相当灵活,解除sql与程序的耦合,便于统一管理,
支持编写动态sql语句并且可重用,
消除JDBC大量冗余的代码,很好的与各种数据库兼容
能够与Spring很好的集成
提供映射标签支持对象与数据库的ORM字段关系映射
缺点:sql语句编写工作量大,sql语句依赖数据库,不能随意更换数据库
#{}和¥{}的区别?
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性
当实体类中的属性名和表中的字段名不一样怎么办?
查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
通过来映射字段名和实体类属性名的--对应关系
mybatis的缓存机制
Local Cache 进行查询,如果缓存命中
的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入 Local Cache ,最后
返回结果给用户
1.MyBatis 一级缓存的生命周期和 SqlSession 一致。
2. MyBatis 一级缓存内部设计简单,只是一个没有容量限定的 HashMap ,在缓存的功能性上有
所欠缺。
3. MyBatis 的一级缓存最大范围是 SqlSession 内部,有多个 SqlSession 或者分布式的环境下,
数据库写操作会引起脏数据,建议设定缓存级别为 Statement
JDBC的步骤有哪些?
1.装载相应的数据库JDBC驱动并进行初始化
2.建立JDBC和数据库之间的Connection连接
3.创建Statement或者PreparedStatement接口,执行sql语句
4.处理和显示结果
5.释放资源
Mybatis中如UserMapper.java是接口,为什么没有实现类还能调用?
使用JDK动态代理+MapperProxy,本质上调用的是MapperProxy的invoke方法

SpringBoot

SpringBoot的优点
1.独立运行
2.简化配置
3.自动配置
4.无代码生成和XML配置
5.应用监控

Springboot核心注解
@springbootapplication
@springbootconfiguration
@enableAutoConfiguration
@ComponentScan

运行springboot有几种方式
1.打包用命令或者放到容器中运行
2.用maven/Gradle插件运行
3.直接执行main方法运行

如何理解Springboot中的Starters?
可以理解为启动器,包含了许多项目中需要用到的依赖,快速运行

springboot配置加载顺序
properties文件,yaml文件,系统环境变量,命令行参数

Springboot核心配置文件?
application和bootstrap配置文件

Mysql

数据库三范式是什么
第一范式:列不可再分
第二范式:属性完全依赖于主键
第三范式:属性不依赖于其它非主属性    属性直接依赖于主键
最终目的:减少数据的冗余

数据库的命名规范:
1.字段名必须以字母开头,尽量不要使用拼音
2.长度不能超过30个字符
3.不能使用sql的保留字
4.只能使用az,AZ,0-9,$等
5.多个单词用下划线隔开

常用基础函数
lower--数据转小写
upper--数据转大写
length--数据的长度
substr--截取
replace--替换
ifnull--判断是否为null
round&ceil&floor---round四舍五入,ceil向上取整,floor向下取整
uuid--返回uuid
now--查询时间
year&month&day--查询年月日
'  '--转义字符

条件查询
distinct--去除重复的记录行
where--后面带条件
like--通配符,通配符前面的值表示以什么开头
null--过滤字段值为空的
between and---在什么之间
limit---分页查询
order by--默认升序
order by desc--降序

聚合查询
count--查询有多少条数据
max/min--求字段的最大最小值
sum/avg--总记录数

分组查询
group by--表示分组
having--过滤返回的结果

表的关系
一对一,一对多,多对一,多对多

数据库的事务
什么是数据库的事务?
将一堆的sql语句绑定在一起执行,要么都执行成功,要么都执行失败,否则就会恢复到sql之前的状态

主键和外键的区别?
主键在本表中是唯一不可为空的外键可以重复可以为空,外键和另一张表的主键关联,不能创建对应表中不存在的外键

事务的特性:
原子性:只有所有操作都成功整个事务才会提交
一致性:事务操作成功后,数据库所处的状态和他的业务规则是一致的,数据不会被破坏
隔离性:不同的事务拥有各自的数据空间,所有操作不会互相干扰
持久性:一旦事务提交成功,事务中所有操作都必须持久化到数据库中

事务隔离级别
读未提交:安全性最差,可能发生并发数据问题,性能最好
读提交:Oracle默认的隔离级别
可重复读:mysql默认的隔离级别,安全性较好,性能一般
串行化:表级锁,读写都加锁,效率低下,安全性高,不能并发

索引是什么?
帮助mysql高效获取数据的数据结构,加快数据库的查询包括聚集索引,覆盖索引,组合索引,前缀索引,唯一索引

SQL优化手段:
1.查询语句中不要使用select*
2.尽量减少子查询,使用关联查询代替
3.减少使用IN或者Not IN,使用exists,not exists或者关联查询语句替代
4.避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
5.or的查询尽量使用union或者union all代替
6.避免在where子句中对字段进行null判断

数据库优化方式?
1.选取最适用的字段属性
2使用连接查询(join)代替子查询(Sub-queries)
3.使用联合查询(union)来代替手动创建临时表
4.事务
5.锁定表
6.使用外键
7.使用索引
8.优化的查询语句

什么是视图?
一种虚拟的表,可以对视图进行增删改查,是有一个表或者多个表的行列的子集

什么是内连接,左外联接,右外联接
内联接(Inner Join):匹配2张表中相关联的记录。
左外联接(Left Outer Join
):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记
录,右表中未匹配到的字段用NULL
表示。
右外联接(Right Outer Join
):除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记
录,左表中未匹配到的字段用NULL
表示。在判定左表和右表时,要根据表名出现在Outer Join的左右位置关系。

并发事务会带来哪些问题
脏读,丢失修改,不可重复读,幻读

大表如何优化?
1.限定数据的范围
2.读写分离
3.垂直分区
4.水平分区

分库分表之后id主键如何处理
UUID:不适合做主键,太长并且无序不可读,查询效率低
数据库自增id:需要独立部署数据库实例,成本高,有性能瓶颈
利用redis生成id:性能比较好,不依赖数据库,可用性降低,编码复杂,增加系统成本

Mysql中一条查询sql是如何执行的?
1.取得链接
2.查询缓存
3.分析器
4.优化器
5.执行器

索引有什么优点和缺点?
优点:提高数据查询速度,降低数据库io成本
缺点:占用储存空间,降低更新表的速度

Mysql索引类型有哪些?
主键索引,普通索引,唯一索引,全文索引,空间索引,前缀索引

什么时候不要使用索引?
1.经常增删改的列不要建立索引
2.有大量重复的列
3.表记录太少

数据库的锁?
共享锁
排他锁
表锁
行锁

什么是悲观锁
为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务 ,无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。
什么是乐观锁?
通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据

怎么避免死锁的出现?
1.设置获取锁的超时时间
2.设置按照统一顺序访问资源
3.避免事务中的用户交叉
4.保持事务简短并在一个批处理中
5.使用低隔离级别
6.使用绑定链接

主键与索引的区别
主键一定会创建一个唯一索引,但是又唯一索引的列不一定是主键
主键不允许为空,唯一索引列允许空值
一个表只能有一个主键,但是可以又多个唯一索引
主键可以被其他表引用为外键,唯一索引不可以
主键是一种约束,而唯一索引是一种索引,是表的冗余数据结构

Mysql如何做到高可方案
1.mysql高可用:分库分表,通过mycat连接多个mysql
2.mycat也得高可用:haproxy,连接多个mycat
3.haproxy也得高可用:通过keepalived辅助haproxy

JavaSE

Java语言的特点:
1.简单易学,有丰富的类库
2.面向对象(查询==程序耦合度低,内聚性更高)
3.与平台无关
4.可靠性安全
5.支持多线程

八大基本类型及封装类
在这里插入图片描述

Java自动装箱:将基本类型转换为包装类型
Java自动拆箱:将包装类型转换为基本类型

对面向对象的理解?
是由一组数据结构和处理他们的方法组成的,重点数据包括对象的特性,状态等的静态信息
面向对象的目的:解决软件系统的可拓展性,可维护性和可重用性

封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读写和修改的访问级别
继承:子类继承父类,可以继承父类的方法和属性,可以对父类方向进行覆盖
多态:一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中的实现方法,必须在程序运行期间才能决定

重写与重载的区别
重写:父类与子类之间,方法名,参数列表,返回值类型必须相同,访问修饰符大于重写方法的修饰符,不能抛出新的检查异常
重载:同名方法有不同参数列表(参数类型不同,参数个数不同,参数顺序不同)视为重载,不能通过返回值类型判断

java中实现多态的机制是什么?
方法的重写和重载

常用的数据结构:链表,堆栈,二叉树,队列,图,堆,集合

Java程序怎么优化?
1.明确对性能的具体要求
2.了解当前程序的性能
3.找到程序的性能瓶颈
4.采取适当的措施来提高性能
5.只进行某一方面的修改来提高性能
6.返回到步骤3继续做类似的工作,一直达到要求的性能为止

equals与==的区别
==:比较两个变量在栈内存中存放的对象的地址值
equals:比较的是两个对象的内容是否相等

String  StringBuilder和StringBuffer的区别
String是只读字符串,并不是基本类型而是一个对象每次对String的操作都会生成一个新的对象
StringBuilder和StringBuffer都是可变的字符数组StringBuffer对方法加了同步锁所以是线程安全

Object常用方法
clone:实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法
finalize
判断一个对象是否可以被回收的最后一步就是判断是否重写了此方法。
equals:一般
equals == 是不一样的,但是在 Object 中两者是一样的
hashCode:哈希查找,重写了
equals 方法一般都要重写 hashCode 方法
wait:调用该方法后当前线程进入睡眠状态
notify:配合
synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程
notifyAll:配合
synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程

Java的四种引用,强弱软虚
强引用是平常中使用最多的引用,强引用在程序内存不足( OOM )的时候也不会被回收
软引用在程序内存不足时,会被回收
弱引用就是只要 JVM垃圾回收器发现了它,就会将之回收
虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入
ReferenceQueue
Java创建对象的几种方式
new创建对象
通过反射机制
采用clone机制
通过反序列化机制
final有哪些用法?
final 修饰的类不可以被继承
final 修饰的方法不可以被重写
final 修饰的变量不可以被改变 .如果修饰引用,那么表示引用不可变,引用指向的内容可变 .
final 修饰的方法 ,JVM 会尝试将其内联,以提高运行效率
final 修饰的常量 ,在编译阶段会存入常量池中
final,finally,finalize的区别?
final用于声明属性,方法和类分别表示属性不可变,方法不可覆盖,类不可继承
finally是异常处理的语句结构的一部分,表示总是执行
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收

获取一个类class对象的方式
1.通过类对象的 .getClass() 方法获取
2.通过类的静态成员表示,每个类都有隐含的静态成员 .class。
3.通过
Class 类的静态方法 .forName() 方法获取。

深拷贝和浅拷贝
浅拷贝(
shallowCopy)只是增加了一个指针指向已存在的内存地址
深拷贝(deepCopy
)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,

堆和栈的区别
栈内存是运行单位,代表着逻辑,包含基本数据类型和堆中对象引用
堆是储存单位,代表着数据

类的生命周期
加载,连接,初始化,使用和卸载

Java的类加载器的种类?
1.根类加载器
2.扩展类加载器

3.系统类加载器
4.自定义类加载器

java的对象结构
对象头,实例数据,对齐填充

抽象类和接口有什么异同?
不同点:
1.抽象类中可以定义构造器,接口不能
2.抽象类可以有抽象方法和具体方法,接口不能有具体方法
3.接口中的成员变量都是public的,抽象类中的成员可以使用private,public,protected,默认等修饰
4.抽象类中可以定义成员变量,接口中只能是常量
5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
6.抽象类中可以包含静态方法,接口中不能有静态方法
7.一个类只能继承一个抽象类,一个类可以实现多个接口
相同点:
1.不能够实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法进行实现,否则该类仍然需要被声明为抽象类

java有几种排序方法?
1.插入排序(直接插入排序,希尔排序)
2.交换排序(冒泡排序,快速排序)
3.选择排序(直接选择排序,堆排序)
4.归并排序,分配排序(箱排序,基数排序)

java程序是如何执行的
1.把
Java 代码编译成字节码
2.把
class 文件放置到 Java 虚拟机
3.Java
虚拟机使用类加载器(Class Loader)装载 class 文件
4.JVM 解释器会把字节码翻译成机器码交由操作系统执行

 锁的优化机制
锁的状态:无锁-偏向锁-轻量级锁-重量级锁
锁的优化:自旋锁,自适应锁,锁消除,锁粗化,偏向锁,轻量级锁

产生死锁的四个必要条件
1. 互斥条件:一个资源每次只能被一个线程使用
2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
3. 不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺
4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系

避免死锁(指定获取锁的顺序)

Java内存溢出的原因?
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据
2.集合类中有对象的引用,使用完未清空,使得jvm不能回收
3.代码中存在死循环或者产生过多重复的对象实体
4.使用的第三方软件中的bug
5.启动参数内存值设定的过于小

数组和集合

ArrayList和linkedList的区别
Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的
缺点
: 数组初始化必须指定初始化的长度, 否则报错
List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection
Set(
注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。
Map(
Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引 用相同的对象,但Key不能重复

List,set,Map有什么区别?
List是有序的,允许重复,允许按照对象在集合中的索引位置检索对象
Map是无序的,不能重复,
Set是无序的,不允许重复

ArrayList和LinkedList的区别有哪些
ArrayList:是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)
因为地址连续,
ArrayList 要移动数据,所以插入和删除操作效率比较低。
LinkedList
基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等 一个连续的地址。对于新增和删除操作,比较占优势,适用于要头尾操作或插入指定位置的场景。
因为 LinkedList
要移动指针,所以查询操作性能比较低。

适用场景
当需要对数据进行对随机访问的时候,选用 ArrayList。
当需要对数据进行多次增加删除修改时,采用 LinkedList

HashMap HashTable的区别
1、两者父类不同 
HashMap
是继承自 AbstractMap 类,而 Hashtable 是继承自 Dictionary类
2、对外提供的接口不同
Hashtable HashMap 多提供了 elments() contains() 两个方法。 elments() 方法继承自
Hashtable 的父类 Dictionnary elements() 方法用于返回此 Hashtable 中的 value 的枚举。
3 、对 null 的支持不同
Hashtable key value 都不能为 null
HashMap key 可以为 null ,但是这样的 key 只能有一个,因为必须保证 key 的唯一性;可以有多个
key 值对应的 value null。
4、安全性不同
HashMap 是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自
己处理多线程的安全问题。
Hashtable 是线程安全的,它的每个方法上都有 synchronized 关键字,因此可直接用于多线程中。
5 、初始容量大小和每次扩充容量大小不同
6 、计算 hash 值的方法不同
有没有可能两个不相等的对象有相同的hashcode
有可能, 在产生 hash 冲突时 , 两个不相等的对象就会有相同的 hashcode . hash 冲突产生时 , 一般
有以下几种方式来处理 ::
拉链法
开放定址法
再哈希
GC垃圾回收机制
触发条件:重写调用system.gc时触发,系统自身来决定GC触发的时机
判断对象可以被回收:引用计数,可达性分析
GC最基础的算法:标记-清除算法,复制算法,标记—压缩算法,分代收集算法

多线程并发

程序 是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代
码。
进程 是程序的一次执行过程,是系统运行程序的基本单位
线程与进程相似,但线程是一个比进程更小的执行单位与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源
线程的生命周期?几种状态?
创建,就绪,运行,阻塞,死亡
创建线程的方式
1. 继承 Thread
2. 实现 Runnable 接口
3. 实现 Callable 接口
4. 线程池方式创建并发
Thread 类中的 start() run() 方法有什么区别
start() 方法被用来启动新创建的线程
调用 run() 方法的时候,只会是在原来的线程中调用,没有新的线程启动
并行,串行的区别
串行在时间上不可能发生重叠,前一个任务没执行完毕,下一个任务只能等着
并行在时间上是重叠的,两个任务同一时刻互不干扰的同时执行
并发允许两个任务彼此干扰,统一时间点只有一个任务允许,交替执行
并发(线程安全)的三大特征: 原子性,可见性,有序性
多线程的好处:发挥多核CPU的优势,防止阻塞,便于建模
什么是线程安全?
代码 在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的
线程安全的级别: 不可变 绝对线程安全,相对线程安全,线程非安全
Java 线程池中 submit() execute()方法有什么区别?
execute()
方法的返回类型是 void ,它定义在 Executor 接口中 ,
submit() 方法可以返回持有计算结果的 Future 对象,它定义在 ExecutorService 接口中,
线程池的好处
1.
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗
2.提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行
3.提高线程的可管理性,使用线程池可以进行统一的分配,调优和监控。
Java线程池中队列常用类型
ArrayBlockingQueue 是一个基于数组结构的 有界阻塞队列 ,此队列按 FIFO (先进先出)原则
对元素进行排序。
LinkedBlockingQueue 一个基于链表结构的 阻塞队列 ,此队列按 FIFO (先进先出)排序元素,吞吐量通常要高于 ArrayBlockingQueue
SynchronousQueue 一个不存储元素的 阻塞队列
PriorityBlockingQueue 一个具有优先级的 无限阻塞队列 PriorityBlockingQueue 也是 基于 最小二叉堆实现
DelayQueue 是一个没有大小限制的队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。
线程池的核心参数概念
1. 最大线程数 maximumPoolSize
2. 核心线程数 corePoolSize
3. 活跃时间 keepAliveTime
4. 阻塞队列 workQueue
5. 拒绝策略 RejectedExecutionHandler
线程池的拒绝策略
1. AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
2. CallerRunsPolicy:只用调用者所在的线程来处理任务
3. DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务
4. DiscardPolicy:直接丢弃任务,也不抛出异常

异常处理机制

怎么处理java异常
try-catch-finally
try 块负责监控可能出现异常的代码
catch 块负责捕获可能出现的异常,并进行处理
finally 块负责清理各种资源,不管是否出现异常都会执行
其中 try
块是必须的,catch finally 至少存在一个标准异常处理流程


try catch finallytry里有returnfinally还执行么?
1、不管有木有出现异常,finally块中代码都会执行
2
、当trycatch中有return时,finally仍然会执行;
3
finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4
finally中最好不要包含return,否则程序会提前退出,返回值不是trycatch中保存的返回值

Java可抛出(Throwable)的结构分为三种类型
被检查的异常 (CheckedException)
运行时异常 (RuntimeException)
错误 (Error)
error和exception有什么区别?
Error表示系统级的错误和程序不必处理的异常,我们无法处理他
exception表示是可以捕捉或者需要程序进行处理的异常
常见的五种运行时异常
ClassCastException (类转换异常)
IndexOutOfBoundsException (数组越界)
NullPointerException (空指针异常)
ArrayStoreException (数据存储异常,操作数组是类型不一致)
BufferOverflowException
被检查异常
IOException
FileNotFoundException
SQLException
Java 序列化中如果有些字段不想进行序列化,怎么办?
使用 transient 关键字修饰, 阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化
时,被 transient 修饰的变量值不会被持久化和恢复。 transient 只能修饰变量,不能修饰类和方
法。

IO流

Java IO 流分为几种
按照流的流向分,可以分为输入流和输出流
按照操作单元划分,可以划分为字节流和字符流
按照流的角色划分为节点流和处理流。

什么是序列化,如何实现序列化?
序列化就是一种来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。
实现方式:将需要被序列化的类实现Seralizable接口该接口没有需要实现的方法

字节流和字符流的区别?
字节流读取数据的时候,读到一个字节就返回一个字节,字符流使用了字节流读到一个或者多个字节时,先去查指定的编码表,将查到的字符返回

反射机制

在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,
都能够调用它的任意一个方法。在 java 中,只要给定类的名字,就可以通过反射机制来获得类的所
有信息。
反射的实现方式
获取class对象
1.Class.forName(“ 类的路径”)
2. 类名 .class
3. 对象.getClass()
4. 基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象
实现Java反射的类
1.Class :表示正在运行的 Java 应用程序中的类和接口注意所有获取对象信息都需要Class 类来实现
2.Field :提供有关类和接口的属性信息,以及对它的动态访问权限
3. Constructor: 提供关于类的单个构造方法的信息以及它的访问权限
4.Method :提供类或接口中某个方法的信息
反射机制的优点和缺点
优点: 能够运行时动态获取类的实例,提高灵活性,与动态编译结合
缺点: 使用反射性能较低,需要解析字节码,将内存中的对象进行解析
解决方案: 关闭JDK的安全检查来提升反射速度,多次创建一个类的实例时,有缓存会快很多,ReflflectASM工具类,通过字节码生成的方式加快反射速度,
相对不安全,破坏了封装性(因为通 过反射可以获得私有方法和属性
通过 setAccessible(true)
关闭 JDK 的安全检查来提升反射速度

Vue

Vue的优点:
1.轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十 kb ;
2.简单易学:国人开发,中文文档,不存在语言障碍 ,易于理解和学习;
3.双向数据绑定:保留了 angular 的特点,在数据操作方面更为简单;
4.组件化:保留了 react 的优点,实现了 html 的封装和重用,在构建单页面应用方面有着独特的优势;
5.视图,数据,结构分离:使数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作;
6.虚拟DOM:dom 操作是非常耗费性能的, 不再使用原生的 dom 操作节点,极大解放 dom 操作,但具体操作的还是 dom 不过是换了另一种方式;
7.运行速度更快:相比较于 react 而言,同样是操作虚拟 dom ,就性能而言, vue 存在很大的优势。

Vue中常用的一些指令:
1.v-model指令:用于表单输入,实现表单控件和数据的双向绑定。
2.v-on:简写为@,基础事件绑定
3.v-bind:简写为:,动态绑定一些元素的属性,类型可以是:字符串、对象或数组。
4.v-if指令:取值为true/false,控制元素是否需要被渲染
5.v-else指令:和v-if指令搭配使用,没有对应的值。当v-if的值false,v-else才会被渲染出来。
6.v-show指令:指令的取值为true/false,分别对应着显示/隐藏。
7.v-for指令:遍历data中存放的数组数据,实现列表的渲染。
8.v-once: 通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新

v-show和v-if指令的共同点和不同点:
相同点:v-show和v-if都能控制元素的显示和隐藏。
不同点:
1.实现本质方法不同:v-show本质就是通过设置css中的display设置为none;控制隐藏v-if是动态的向DOM树内添加或者删除DOM元素;
2.v-show都会编译,初始值为false,只是将display设为none,但它也编译了;v-if初始值为false,就不会编译了
总结:v-show只编译一次,后面其实就是控制css,而v-if不停的销毁和创建,如果要频繁切换某节点时,故v-show性能更好一点。

说说vue的生命周期的理解:
beforecreate (初始化界面前)
created (初始化界面后)
beforemount (渲染界面前)
mounted (渲染界面后)
beforeUpdate (更新数据前)
updated (更新数据后)
beforedestory (卸载组件前)
destroyed (卸载组件后)

Vue组件通信有哪些方式:
1.父传子:props
父组件通过 props 向下传递数据给子组件。注:组件中的数据共有三种形式:data、props、computed
2.父传子孙:provide 和 inject
父组件定义provide方法return需要分享给子孙组件的属性,子孙组件使用 inject 选项来接收指定的我们想要添加在这个实例上的 属性;
3.子传父:通过事件形式
子组件通过 $emit()给父组件发送消息,父组件通过v-on绑定事件接收数据。
4.父子、兄弟、跨级:eventBus.js
这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来(e m i t ) 触 发 事 件 ( emit)触发事件和(emit)触发事件和(on)监听事件,巧妙而轻量地实现了任何组件间的通信。
5.通信插件:PubSub.js
6.vuex
vuex 是 vue 的状态管理器,存储的数据是响应式的。只需要把共享的值放到vuex中,其他需要的组件直接获取使用即可;

router和route的区别:
router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,例如history对象。。。经常用的跳转链接就可以用this.$router.push,和router-link跳转一样。
route相当于当前正在跳转的路由对象。。可以从里面获取name,path,params,query等

vue-router有几种钩子函数?
1.全局路由
全局导航钩子主要有两种钩子:前置守卫(beforeEach)、后置钩子(afterEach)
2. 路由独享的钩子
单个路由独享的导航钩子,它是在路由配置上直接进行定义的
3.组件内的导航钩子
组件内的导航钩子主要有这三种:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。他们是直接在路由组件内部直接进行定义的。
ps:详细知识点可以点击路由导航守卫查看;

vue-router路由跳转方式:
编程式( js跳转)

this.$router.push('/home')
this.$router.push({name:'home'})
this.$router.push({path:'/home'})

声明式(标签跳转)

  <router-link :to="{name:'home'}"></router-link>
  <router-link :to="{path:'/home'}"></router-link>

axios 是什么,其特点和常用语法
1.Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。前端最流行的 ajax 请求库,
2.react/vue 官方都推荐使用 axios 发 ajax 请求
特点:
1.基于 promise 的异步 ajax 请求库,支持promise所有的API
2.浏览器端/node 端都可以使用,浏览器中创建XMLHttpRequests
3.支持请求/响应拦截器
4.支持请求取消
5.可以转换请求数据和响应数据,并对响应回来的内容自动转换成 JSON类型的数据
6.批量发送多个请求
7.安全性更高,客户端支持防御 XSRF,就是让你的每个请求都带一个从cookie中拿到的key, 根据浏览器同源策略,假冒的网站是拿不到你cookie中得key的,这样,后台就可以轻松辨别出这个请求是否是用户在假冒网站上的误导输入,从而采取正确的策略。

做过哪些Vue的性能优化?
1.尽量减少data中的数据,data中的数据都会增加getter和setter,会收集对应的watcher
2.v-if和v-for不能连用
3.如果需要使用v-for给每项元素绑定事件时使用事件代理
4.SPA 页面采用keep-alive缓存组件
5.在更多的情况下,使用v-if替代v-show
6.key保证唯一
7.使用路由懒加载、异步组件
8.防抖、节流
9.第三方模块按需导入
10.长列表滚动到可视区域动态加载
11.图片懒加载

SpringCloud

cloud有什么优势
1.与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题
2.服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈
3.冗余-分布式系统中的冗余问题
4.负载平衡 --负载平衡改善跨多个计算资源的工作负荷
5.性能-问题 由于各种运营开销导致的性能问题
6.部署复杂性-Devops 技能的要求

什么是服务熔断?什么是服务降级?
熔断机制:是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路
服务降级:一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端 可以自己准备一个本地的fallback
回调,返回一个缺省值

Eureka 和zookeeper两个的区别?
Zookeeper 保证了 CP C :一致性, P :分区容错性), Eureka 保证了 AP A :高可用)
Springboot和springcloud的区别?
Boot
专注于快速方便的开发单个个体微服务
Cloud 是关注全局的微服务协调整理治理框架
Boot 可以离开 Cloud 独立使用开发项目,但是SpringCloud 离不开 SpringBoot ,属于依赖的关系.
总结: SpringBoot 专注于快速、方便的开发单个微服务个体 SpringCloud 关注全局的服务治理框架
Hystrix如何实现容错?
Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避
免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。
eureka 自我保护机制是什么 ?
Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户
端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保
护模式。
什么是 Ribbon
是一个负载均衡客户端,可以很好的控制 htt tcp 的一些行为。 feign 默认集成了 ribbon
什么是 feigin ?它的优点是什么?
1.feign 采用的是基于接口的注解
2.feign 整合了 ribbon ,具有负载均衡的能力
3. 整合了 Hystrix ,具有熔断的能力
Ribbon Feign 的区别?
1.Ribbon 都是调用其他服务的,但方式不同。
2. 启动类注解不同, Ribbon @RibbonClient feign
的是 @EnableFeignClients
3. 服务指定的位置不同, Ribbon 是在 @RibbonClient 注解上声明, Feign则是在定义抽象方法的接口中使用@FeignClient 声明。
4. 调用方式不同, Ribbon 需要自己构建 http请求,模拟http 请求
注册中心挂了, consumer 还能不能调用 provider?
可以。因为刚开始初始化的时候, consumer 会将需要的所有提供者的地址等信息拉取到本地缓
存,所以注册中心挂了可以继续通信。但是 provider 挂了,那就没法调用了。

Dubbo 负载均衡策略
随机(默认):随机来
轮训:一个一个来
活跃度:机器活跃度来负载
一致性 hash :落到同一台机器上
Dubbo 容错策略
failover cluster 模式
failback 模式
failfast cluster 模式
failsafe cluster 模式
forking cluster 模式
broadcacst cluster 模式
常见负载均衡算法
常见限流算法
计数器算法(固定窗口)
滑动窗口
漏桶算法
令牌桶算法

Nginx

Nginx是一个web服务器和方向代理服务器

Nginx的优点:更快,高扩展性,跨平台,高可靠性,低内存消耗,单机支持10万以上的并发连接,热部署

Nginx的特性
1. Nginx服务器的特性包括:
2. 反向代理
/L7负载均衡器
3. 嵌入式
Perl解释器
4. 动态二进制升级
5. 可用于重新编写
URL,具有非常好的PCRE支持

Nginx和Apache 之间的不同点

什么是正向代理和反向代理
正向代理:客户端运行一个软件,将我们的HTTP请求转发到其他不同的服务器端,实现请求的分发
反向代理:服务器端接收客户端的请求,然后将请求分发给具体的服务器进行处理,然后再将服务器的相应结果反馈给客户端

Redis

为什么要使用缓存?
提升读写性能,更高的并发量

redis有什么好处?
读取速度快,因为数据存在内存中,所以数据获取快;
支持多种数据结构,包括字符串、列表、集合、有序集合、哈希等;
支持事务,且操作遵守原子性,即对数据的操作要么都执行,要么都不支持;
还拥有其他丰富的功能,队列、主从复制、集群、数据持久化等功能。
缺点:
由于 Redis
是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然
Redis 本身有
Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定
期删除数据。如果进行完整重同步,由于需要生成 RDB
文件,并进行传输,会占用主机的 CPU并会消耗现网的带宽。不过 Redis 2.8 版本,已经有部分重同步的功能,但是还是有可能有完整重同步的

什么是redis?
一个开源、基于内存、支持多种数据结构的存储系统,可以作为数据库、缓存和消息中间件。它支持的数据结构有字符串、哈希、列表、集合 、有序集合(sorted sets)等,除此之外还支持bitmapshyperloglogs 和地理空间( geospatial )索引半径查询等功能。

为什么 Redis 单线程模型效率也能那么高?
1. C 语言实现,效率高
2. 纯内存操作
3. 基于非阻塞的 IO 复用模型机制
4. 单线程的话就能避免多线程的频繁上下文切换问题
5. 丰富的数据结构(全称采用 hash 结构,读取速度非常快,对数据存储进行了一些优化,比如亚
索表,跳表等)
Redis持久化的方式:
RDB持久化方式:用数据集快照的方式半持久化模式)记录(默认)
优点:
只有一个文件 dump.rdb ,方便持久化。
容灾性好,一个文件可以保存到安全的磁盘。
性能最大化, fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单
独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 Redis 的高性能 )
相对于数据集大时,比 AOF 的启动效率更高。
缺点:
数据安全性低。 RDB 是间隔一段时间进行持久化,如果持久化之间 Redis 发生故障,会发生数据
丢失。所以这种方式更适合数据要求不严谨的时候
AOF持久化方式:指所有的命令行记录以 Redis 命令请求协议的格式完全持久化存储,保存为 AOF 文件。
优点:
1.数据安全, AOF 持久化可以配置 appendfsync 属性,有 always ,每进行一次命令操作就记录
AOF 文件中一次。
2. 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis - check - aof 工具解决数据
一致性问题
3. AOF 机制的 rewrite 模式。 AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重
写),可以删除其中的某些命令(比如误操作的 flushall )
缺点: AOF 文件比 RDB 文件大,且恢复速度慢。 数据集大的时候,比 RDB 启动效率低
怎么选择持久化方式:
RDB会丢失很多数据,AOF恢复速度慢
redis支持同时开启两种持久化方式
Redis常见性能问题和解决方案:
1.Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件;
2.如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次;
3.为了主从复制的速度和连接的稳定性, Master Slave 最好在同一个局域网内;
4.尽量避免在压力很大的主库上增加从库;
5.主从复制不要用图状结构,用单向链表结构更为稳定,即: Master <- Slave1 <- Slave2 <-
Slave3…. ;这样的结构方便解决单点故障问题,实现 Slave Master 的替换。如果 Master
了,可以立刻启用 Slave1 Master ,其他不变
什么情况下会导致Redis阻塞
内部原因:
如果 Redis 主机的 CPU 负载过高,也会导致系统崩溃;
数据持久化占用资源过多;
Redis API 或指令使用不合理,导致 Redis 出现问题。
外部原因:
外部原因主要是服务器的原因,例如服务器的 CPU 线程在切换过程中竞争过大,内存出现问题、网络问题等。
怎么提高缓存命中率
提前加载数据到缓存中;
增加缓存的存储空间,提高缓存的数据;
调整缓存的存储数据类型;
提升缓存的更新频率
Redis报内存不足怎么解决
1.修改配置文件redis.conf的maxmemory参数,增加redis可用内存
2.设置缓存淘汰策略,提高内存的使用率
3.使用redis集群模式,提高储存量
 

分布式

HTTP请求所经历的步骤
1.DNS解析
2.HTTP请求
3.客户端向服务器发送请求命令(get,post),客户端发送请求头信息和数据
4.服务器发送应答头信息,服务器向客户端发送数据
5.服务器关闭TCP连接
6.客户端根据返回的html,css,js进行渲染

ACID:指数据库事务的四个基本要素
1.原子性  2.一致性  3.隔离性  4.持久性

CAP:在一个分布式系统中,一致性,可用性,分区容忍性

BASE理论:
Basically Available(基本可用)
Soft state(软状态)
Eventually consistent(最终一致性)

分布式事务提交解决方案:
1. 两阶段提交(2PC)
2. 三阶段提交
(3PC)
3. 补偿事务
(TCC=Try-Confifirm-Cancel)
4. 本地消息队列表
(MQ)
5. Sagas事务模型
(最终一致性)

分布式ID的特性:
1.唯一性  2.有序递增性  3.高可用性  4.带时间

UUID:算法的核心思想是结合机器的网卡、当地时间、一个随记数来生成UUID
优点:本地生成,生成简单,性能好,没有高可用风险
缺点:长度过长,储存冗余,且无序不可读,查询效率低

如何提高系统的并发能力
使用分布式系统。
部署多台服务器,并做负载均衡。
使用缓存(Redis
)集群。
数据库分库分表 +
读写分离。
引入消息中间件集群。

JavaWeb

HTTP响应码
200:成功,
Web 服务器成功处理了客户端的请求。
301:永久重定向,当客户端请求一个网址的时候,
Web 服务器会将当前请求重定向到另一个网址,搜索引擎会抓取重定向后网页的内容并且将旧的网址替换为重定向后的网址。
302:临时重定向,搜索引擎会抓取重定向后网页的内容而保留旧的网址,因为搜索引擎认为
重定向后的网址是暂时的。
400:客户端请求错误,多为参数不合法导致 Web
服务器验参失败。
404:未找到,
Web 服务器找不到资源。
500:
Web 服务器错误,服务器处理客户端请求的时候发生错误。
503:服务不可用,服务器停机。
504:网关超时

Get和Post请求的区别:
get 请求用来从服务器获取资源
post 请求用来向服务器提交数据

TCP和UDP的区别
1.TCP面向连接       UDP是无连接
2.TCP提供可靠的服务   UDP不保证可靠交付

3.UDP具有较好的实时性
4.TCP只能是点到点    UDP支持一对一,多对多,多对一,一对多

5.TCP对系统资源要求多  UDP要求少

HTTP和HTTPS的区别
端口不同:HTTP
HTTPS 的连接方式不同没用的端口也不一样,HTTP80HTTPS 用的是443
消耗资源:和HTTP
相比,HTTPS通信会因为加解密的处理消耗更多的CPU和内存资源。
开销: HTTPS
通信需要证书,这类证书通常需要向认证机构申请或者付费购买

TCP如何保证可靠性
1.序列号和确认号机制
2.超时重发机制
3.对乱序数据包重新排序
4.丢弃重复数据
5.流量控制

如何实现跨域:JSONPCORS方式、代理方式

设计模式

 单例模式:
(1)饿汉式单例模式的写法:线程安全
(2
)懒汉式单例模式的写法:非线程安全
(3
)双检锁单例模式的写法:线程安全

代理模式:
优点
代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;
可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务
缺点:
由于使用了代理模式,因此程序的性能没有直接调用性能高;
使用代理模式提高了代码的复杂度

工厂模式:
优点:
简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类
缺点:
不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑
产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护

Maven

maven 主要服务于基于 java 平台的项目构建,依赖管理和项目信息管理。
Maven能解决什么问题
1.添加第三方jar包
2.jar包之间的依赖关系

3.获取第三方jar包
4.将项目拆分为多个工程模块
maven的优缺点
优点:
简化了项目依赖管理
易于上手,对于新手来说了解几个常用命令即可满足日常工作
便于与持续集成工具( jenkins )整合
便于项目升级,无论是项目本身还是项目使用的依赖
maven 有很多插件,便于功能扩展,比如生产站点,自动发布版本等
为什么使用 Maven 中的各点
缺点:
Maven 是一个庞大的构建系统,学习难度大。(很多都可以这样说,入门容易 [ 优点 ] 但是精通
[ 缺点 ]
Maven 采用约定约定优于配置的策略,虽然上手容易但是一旦出现问题,难于调试中网络环境
较差,很多 repository 无法访问
maven的依赖原则
1.最短路径原则(依赖传递的路径越短越优先)
2.pom文件申明顺序优先
3.覆写原则(直接覆盖父工程传过来)
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐