自我介绍
基本数据类型
byte short int long float double char boolean
默认类型
int
int几位
4字节,32位
1字节byte=8位
breakcontine
break循环结束,跳出循环
continue 跳出本次循环,继续下一次循环
字符串常量池
引号创建字符串,看字符串常量池是否存在,不存在先创建再使用
通过new关键字创建字符串的时候,字符串常量池看是否存在。存在,直接从常量池复制到指定的堆内存中。不存在,先在常量池创建,再复制到堆内存中
StringBuffer,builder
buffer线程安全的,但执行速度慢
list set区别
list,元素有序且可重复
set,无序且不可重复
arraylist,linkedlist
a,是基于动态数组的数据结构默认长度10,满了扩充原来的一半;l,基于双向链表的数据结构
在数组尾端插入或访问数据,a效率更高,因为不需要移动指针
在头部或中间插入数据,l效率更高,因为a需要移动数据
vector
动态数组
元素有序,且可重复,允许一个或多个null
线程安全,但查询效率慢
扩容到2n+1
hashmap,初始容量,扩容
初始容量16,扩容因子0.75,达到容量0.75会扩充到原来的两倍
原理:
底层是数组加链表的数据结构,java8之后加入红黑树
以键值对形式存储数据,根据key的hash值确定存储在数组的位置
如果数组确定的位置已经存在数据,就插入到该元素后面,形成链表
链表元素>8并且总键值对>64,链表就会转换成红黑树,提高查询效率
红黑树节点数<6,重新转换成链表
hashmap hashtable cuncurrentHashMap,treemap
hashtable线程安全 hashmap线程不安全
table键值不可以为空,hashmap可以为空
table用enameration,map用iterator
table,set数组默认长度11,扩容到原来的2n+1,map默认16扩容到原来的两倍
table是对整张表进行加锁,锁的粒度太粗,并发度低
treemap将保存的数据根据键默认从小到大排序
cuncurrentHashMap
java7设计理念是默认分割为16个segment块,并发度16,每个segment块近似看成一个hashmap,每个块都有renntrantlock锁,并发操作时互不影响
java8之后将segment块换成node,每个node也有自己的锁,每个node都有自己的并发度
键和值不允许为空,否则抛出异常
java内存模型JMM
私有:程序计数器,本地方法栈,Java虚拟机栈
公有:堆和方法区
integer(int类型包装类),valueof
会缓存-128到127数据,如果在这个范围内则不新建,不在才会新建
序列化,实现接口
将对象转化为指定的字节码文件,实现serializable
计算机网络几层模型
应用层 HTTP超文本传输协议
传输层 TCP传输控制协议
网络层 IP网际协议地址
数据链路层
物理层
tcp,三次握手的流程
客户端发送连接请求报文
服务端接收连接请求之后回复ACK确认报文,并未这次连接分配资源
客户端接收到ACK报文之后也向服务端发送ACK确认报文,并分配地址,此包发送之后进入establsihed状态,完成三次握手
单例模式
enum 懒汉式 饿汉式
懒汉饿汉区别
懒汉式:什么时候调用什么时候进行初始化
饿汉式:在一开始就创建对象
反射
在程序运行的过程中,对于每个类都可以知道这个类所有的属性和方法,对于每个对象,都能知道这个对象的方法和属性,并且可以改变它的属性
在改变属性,需要设置?
开启私有变量的访问权限
setAccessible
class类,表示的是什么
类对象的字节码文件
class类对象创建
类名.class()
对象名.getClass()
Class.forName("完整包路径")
普通类对象
new,clone(),反序列化,反射的newInstance方法
java8新特性
Lambda表达式
Optional类
新的时间和日期API
方法引用/构造器引用
Stream API
接口的增强
函数接口
having关键字用法
对分组后的结果集进行筛选
用在where,groupby后面
可以用聚合函数
where和groupby一起用?
可以,where在前
索引 唯一,主键索引区别
查询速度快
单列索引:普通索引,唯一索引,主键索引(不允许为空)
组合索引
全文索引
空间索引
组合索引的触发原则
最左前缀原则
有where的话,where支持最左前缀原则,当触发索引中最左字段才会触发索引,中断则不会触发后面的索引
groupby和orderby也支持最左前缀原则,可以看作是where条件的继承,没有where不会触发索引
使用范围条件时会触发该处的索引,但不会触发后面的索引
(是不是越多越好)使用原则
占用空间大,维护难度大,在修改数据的时候也需要对索引进行动态维护
什么条件加索引
对表数据量大,查询频繁,并且重复值较少的列加索引
存储过程优缺点(调试复杂,不利于调试)
优点:是经过预编译的,执行速度快
缺点:调试复杂
事务作用(你了解、用过事务吗)
管理多条sql保证多条要么成功要么失败
特性,原子性?隔离级别,默认
原子性:事务是最小单位不可再分
一致性:事务中的sql要么同时成功要么同时执行失败
隔离性:两事务之间互不干扰
持久性:数据持久到硬盘中
悲观、乐观锁(实现机制,如何用版本号实现)区别
悲观锁:在修改数据之前就把数据锁住,然后再对数据进行读写
乐观锁:在操作数据的时候不会对数据进行加锁,在提交数据之前才会通过一种机制,来验证是否冲突
版本号时间戳:
在查询的时候记录版本号,然后提交数据的时候验证是否冲突,不冲突,提交数据并且更新版本号
死锁
多个线程或事务争夺系统资源而发生相互等待的现象
解决死锁
破坏 循环等待
占有且等待
不可抢占
解决的算法:银行家算法(没有深究)
银行家算法的实质就是要设法保证系统动态分配资源后不进入不安全状态,以避免可能产生的死锁。
即没当进程提出资源请求且系统的资源能够满足该请求时,系统将判断满足此次资源请求后系统状态是否安全,
如果判断结果为安全,则给该进程分配资源,否则不分配资源,申请资源的进程将阻塞。
银行家算法的执行有个前提条件,即要求进程预先提出自己的最大资源请求,并假设系统拥有固定的资源总量
springmvc入口类,工作流程
dispatchservlet
客户端发送请求到d
d解析url,调用相应的映射处理器
d将请求提交给c
c调用相应的业务逻辑层,向d返回m
d根据m获取对应的视图解析器,视图解析器根据m找到指定的视图
视图解析器将数据渲染到视图
d将视图响应给客户端
spring两特性
ioc控制反转,aop面向切面编程
ioc将创建对象的权力交给spring容器
aop将与业务无关的重复代码单独维护成一个切面类,通过声明的方式确定切面类的代码以何种方式,作用在业务切入点的哪个位置
aop 应用场景
权限通知,异常处理,日志,事务管理
通知方式
前置通知
后置通知
返回通知
异常通知
环绕通知
事务哪种通知方式
环绕通知
拦截过滤区别,位置,进servlet,进controller
拦截器基于java反射机制,过滤器基于函数回调
拦截器作用在请求进入congtroller之前,过滤器作用在servlet的service方法之前
拦截器可以多次调用,过滤器只能在容器初始化的时候调用一次
请求转发,重定向
请求转发是服务器行为,重定向是客户端行为
请求转发浏览器url地址栏不变,重定向改变
请求转发是浏览器只做一次访问请求,重定向至少两次
请求转发两次跳转之间传输的信息不会丢失,重定向可能会丢失
mybatis缓存
一级缓存
默认开启,相对于一个sqlsession而言的,在调用insert,update,delete语句的时候会刷新缓存
二级缓存
默认关闭,相对于整个应用程序而言的,要求返回的pojo类,必须是可序列化的
缓存的作用,如何提高查询效率
提高查询效率
在参数和SQL完全一样的情况下,多次调用mapper方法,只会执行一次SQL,第一次执行sql查询到的结果集会被保存在缓存中,
后面重复调用mapper方法返回的是缓存中的结果集
di依赖注入
将spring容器创建的对象注入到相应的组件中
springboot优点,启动类特点
自动装配,约定先于配置,内置tomcat等服务器
启动类被@SpringBootApplication注解声明,这个注解是组合注解,由:
1.@SpringBootConfigration标记当前类为配置类
2.@EnableAutoConfigration 开启自动配置,使用springboot默认配置
3.@CompenentScan 扫描主类同级包以及下级包所有类
springboot启动类处于哪个位置
源代码高一级
restcontroller和controller
restController=controller+response body
responsebody
将返回的对象以字符串的形式返回给客户端
redis用来干什么
高速缓存,分布式锁
什么是分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式
为什么redis高速缓存
基于内存,并且是单线程的
redis特点
1.有16个库
2.单线程的
3.支持主从复制
4.命令执行是原子性的
分布式系统下,redis利用哨兵模式监控主服务器的工作状态,一旦发生故障就会实现主从服务器的切换,保证系统的高可用性
随机 权重
为什么被做分布式锁
串行,单线程
基于内存
支持持久化
主从复制
持久化方案
分别是rdb和aof
rdb:在指定目录下生成快照,redis重启加载快照文件实现数据恢复
aof:采用日志的形式记录每个写操作,并追加到文件中,redis重启将文件中的写操作从前到后重新执行一遍来完成数据恢复
五种数据类型
String
list
hash
set
sortedset
实现有序:给集合中的每个元素加一个分数,根据分数实现从小到大排序
过期时间
expire
分布式锁用哪个命令
setnx
class类代表什么
这个类的字节码文件
事务通知方式
异常处理通知
相等性规则
==,比较基本数据类型,比较的是值,比较引用类型比较的是内存地址
equals,比较引用类型,比较值是否相等,比较Object类比较的是内存地址
String一个比较大小的方法实现的原理
先比较内存是否相等
不相等,逐个比较char类型数组中的元素