本文首发于cartoon的博客
转载请注明出处:https://cartoonyu.github.io/c...java
JAVA
-
抽象类与接口的区别git
-
类github
- 抽象类只能继承一个直接父类,能够实现多个接口
- 接口能够继承多个接口
-
变量redis
- 抽象类容许全部做用域或者关键字进行变量的修饰,与普通类没有区别
- 接口只容许静态不可变的public变量
-
方法算法
- 接口中在jdk1.8以前全部方法都是抽象的public方法,在1.8获得加强,能够有静态方法或者默认的普通方法
- 抽象类中能够有抽象方法,普通方法,静态方法,能够被多种关键字修饰,普通方法中能够有自身的逻辑
-
做用sql
- 接口主要用于模块间行为的约束
- 抽象类主要用于模板类的实现
-
线程不一样步集合转换成线程同步集合以及区别数据库
- 继承原有集合经过java的线程同步机制实现
-
使用Collections的synchronizedXxx方法进行集合的转换数组
- 简单
- 锁的对象为对象,粒度过大
-
使用java.util包中的ConCurrent方法进行包装缓存
- 简单
- 锁的粒度为行级,且锁的种类比较丰富
-
java常见异常以及发生场景(最少5个exception)数据结构
-
OutOfMemoryError
- 建立大对象超过java老年代内存抛出
- 循环调用过多,甚至出现无限循环抛出
-
ClassCastException
- 对象向下转型时发生
-
NullPointerException
- 对象引用未指定对象实例直接使用
-
SQLException
- sql语句执行错误
-
InterruptedException
- 线程意外终止
-
IndexOutOfBoundException
- 数组越界
-
为何要用线程池,线程池有什么参数能够对线程池进行配置
-
使用线程池缘由
- 异步操做频繁形成的线程切换
- 线程频繁建立销毁形成的资源的消耗
-
参数
- ThreadFactory
-
corePoolSize
- CPU密集,n+1
- IO密集,多线程
- keepAliveTime
- maximumPoolSize
-
BlockingQueue
- 6种实现队列
- TimeUnit
-
List,Set,Map的区别
-
存储元素
- List与Set是存储单一元素的集合
- Map是存储key-value对元素的集合
-
元素有序性
- Set与Map内的元素在方法调用层面是无序的
- List元素是有序的
-
元素可重复性
- List元素是可重复的
- Set不容许重复,Map不容许key重复
-
继承接口
- Set与List继承了Collection
- Map是与Collection层次一致的接口
-
Iterator与ListIterator的区别
-
继承性
- ListIterator继承于Iterator
-
遍历集合
- Iterator能够遍历Collection内的全部实现类
- ListIterator只能遍历List接口下的ArrayList以及LinkedList
-
遍历方向
- Iterator只能向下遍历
- ListIterator能够向上向下遍历
-
迭代时修改元素
- Iterator不支持迭代时修改或插入集合元素
- ListIterator支持迭代时修改或删除元素
-
迭代时移除元素
- 两个迭代器均可以在迭代时移除元素
JVM
-
垃圾回收算法
-
标记-清理
- 标记存活对象
- 清除未标记对象
- 效率高,可是会形成内存碎片
-
复制
- 将内存区域划分红清理区与存活区
- 将存活对象复制到存活区
- 清理清理区的全部对象
- 不会形成内存碎片,可是下降内存的使用率
-
标记-整理
- 标记待清理对象
- 将标记对象移到另一侧
- 清理边界外内存区域
- 有效解决了内存碎片的产生以及内存使用率降低的问题
数据库
-
char与varchar的区别
-
数据插入方面
- 当插入数据等于定义长度,二者处理没有区别
-
当插入元素小于定义长度
- char会填充空格到定义长度
- varchar不会填充空格
-
空格问题
-
数据最后出现空格
- char会将空格删除
- varchar不会
-
检索速度
- char比varchar的检索速度快
-
数据库的事务特性
- 原子性(Atomic),事务内操做结果时一致的
- 一致性(Consitency),事务执行先后数据库的状态时一致的
- 隔离性(Isolation),并发事务的执行是互不干扰的
- 持久性(Durability),事务执行结果是永久存储的
-
数据库中select语句执行流程(客户端到存储引擎)
- 客户端经过TCP三次握手与服务端进行链接
- 链接器判断帐号信息是否有效
- 有效,则进入第三步
- 无效,链接器返回Access denied的错误
-
查询缓存中是否有执行的记录
- 不建议使用,能够经过query_cache_type关闭,MySQL 8.0去除了查询缓存的功能
- 有执行记录,则返回上次执行结果
- 没有执行记录,进入第四步
-
分析器进行词法分析,语法分析
-
词法分析
- 判断输入的SQL语句中的关键词的含义
-
语法分析
- 判断SQL是否合法
- 若合法,进入第五步
- 若不合法,返回 You have an error in your SQL syntax错误到客户端
-
sql语句通过优化器选择最佳执行策略
- 多索引状况下的最佳索引的选择
- 多表关联时决定表的链接顺序
-
sql语句交由执行器进行存储引擎的操做并返回结果
- 根据from找到须要查询的表,根据where造成有效的结果集合
- (若是有order by,对数据进行排序)select返回结果
-
数据库中数据更新语句执行流程(客户端到存储引擎)
1. 客户端经过TCP三次握手与服务端进行链接
2. 链接器判断帐号信息是否有效
1. 有效,则进入第三步
2. 无效,链接器返回Access denied的错误
3. 查询缓存中是否有执行的记录
1. 不建议使用,能够经过query_cache_type关闭,MySQL 8.0去除了查询缓存的功能
2. 有执行记录,则返回上次执行结果
3. 没有执行记录,进入第四步
4. 分析器进行词法分析,语法分析
1. 词法分析
1. 判断输入的SQL语句中的关键词的含义
2. 语法分析
1. 判断SQL是否合法
2. 若合法,进入第五步
3. 若不合法,返回 You have an error in your SQL syntax错误到客户端
5. sql语句通过优化器选择最佳执行策略
6. sql语句交由执行器进行存储引擎的操做并返回结果
7. 两段式提交
1. 检查并读入相关数据页到内存
2. 将更新语句的操做行写入内存
1. 写入操做记录到readlog中,处于prepare状态
2. 写入操做记录到binlog中
3. 事务提交,处于commit状态
-
redis的数据类型以及底层实现数据结构
1. string
1. 动态字符串
2. hash
1. 数据量小,压缩链表
2. 数据量大,哈希表
3. list
1. 数据量小,压缩列表
2. 数据量大,双循环链表
4. 有序集合
1. 数据量小,压缩链表
2. 数据量大,跳表
5. set
1. 数据量小,有序数组
2. 数据量大,哈希表
算法
- 将有序数组转换为二叉搜索树