一面 3.25
-
自我介绍+针对自我介绍中的数据库设计大赛的提问
-
泛型作用?类型擦除后是什么类?
- 泛型作用:编译时的类型安全检查
- 泛型擦除:如果[T extends X] ,则泛型擦除为X,否则,被擦除为Object。
- 重载和重写区别?实现泛型接口后将方法里的T替换为String是否算重写?为什么?
实现泛型接口后将方法里的T替换为String是方法重写
- 什么是双亲委派机制?双亲委派的作用?什么时候需要取消双亲委派?说一下相关的应用 https://www.cnblogs.com/crazymakercircle/p/15554725.html
- 什么是双亲委派机制?
当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。- 双亲委派的作用?
- 防止类的重复加载:通过委托去询问上级是否已经加载过该.class,如果加载过了,则不需要重新加载,保证了数据安全。
- 防止破坏核心类:通过委托的方式,保证核心.class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。
- 打破双亲委派的场景
典型的打破双亲委派模型的框架和中间件是tomcat和osgi。打破双亲委派的作用:为了实现各目录下类的隔离。 Tomcat中可以部署多个web项目,为了保证每个web项目互相独立,所以不能都由AppClassLoader
加载,所以自定义了类加载器WebappClassLoader
。WebappClassLoader
继承自URLClassLoader
,重写了findClass
和loadClass
,并且WebappClassLoader
的父类加载器设置为ExtClassLoader
。WebappClassLoader.loadClass
中会先在缓存中查看类是否加载过,没有加载就获取其父类加载器,类加载交由ExtClassLoader
,ExtClassLoader
再交给BootstrapClassLoader
加载;都加载不了,才自己加载;自己也加载不了,就遵循原始的双亲委派,交由AppClassLoader
递归加载。
- 拥塞控制过程
慢开始、拥塞避免、快重传和快恢复
-
TCP可靠连接(三次握手、四次回收过程)?第二次握手时为什么要ACK+SYN?
-
普通IO和NIO的区别?
参考:IO和NIO的区别
- 什么是IO多路复用?
Selector Buffer Channel
- 线程的通信方式?命名管道和匿名管道的区别?
- 线程通信方式:管道、信号、信号量、消息队列、共享内存、套接字
- 命名管道和匿名管道的区别:
- 管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
- 有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
- MYSQL索引命中的规则?
参考:MySQL索引命中规则
- MySQL联合索引遵循最左前缀匹配规则,即从联合索引的最左列开始向右匹配,直到遇到匹配终止条件。例如联合索引(col1, col2, col3), where条件为
col1=a AND col2=b
可命中该联合索引的(col1,col2)前缀部分, where条件为col2=b AND col3=c
不符合最左前缀匹配,不能命中该联合索引。- 匹配终止条件为范围操作符(如>, <, between, like等)或函数等不能应用索引的情况。例如联合索引(col1, col2, col3), where条件为
col1=a AND col2>1 AND col3=c
, 在col2列上为范围查询,匹配即终止,只会匹配到col1,不能匹配到(col1, col2, col3).- where条件中的顺序不影响索引命中。例如联合索引(col1, col2, col3), where条件为
col3=c AND col2=b AND col1=a
, MySQL优化器会自行进行优化,可命中联合索引(col1, col2, col3).
- InnoDB的索引结构是什么?B树和B+树的区别?为什么要用B+树而不是B树?
为什么要用B+树而不是B树?
- 更少的IO次数: B+树的非叶节点只包含键,而不包含真实数据,因此每个节点存储的记录个数比B数多很多(即阶m更大),因此B+树的高度更低,访问时所需要的IO次数更少。此外,由于每个节点存储的记录数更多,所以对访问局部性原理的利用更好,缓存命中率更高。
- 更适于范围查询: 在B树中进行范围查询时,首先找到要查找的下限,然后对B树进行中序遍历,直到找到查找的上限;而B+树的范围查询,只需要对链表进行遍历即可。
- 更稳定的查询效率: B树的查询时间复杂度在1到树高之间(分别对应记录在根节点和叶节点),而B+树的查询复杂度则稳定为树高,因为所有数据都在叶节点。
- 数据库ACID解释
原子性、一致性、隔离性、持久性
- 怎么保证数据库的一致性?
undo log
- undolog和redolog的区别
- redo log保证持久性、undo log保证原子性
- redo log是InnoDB引擎独有的功能、undo log是MySQL数据库的功能
- 算法题:链表区间反转