一面 3.25

  • 自我介绍+针对自我介绍中的数据库设计大赛的提问

  • 泛型作用?类型擦除后是什么类?

  1. 泛型作用:编译时的类型安全检查
  2. 泛型擦除:如果[T extends X] ,则泛型擦除为X,否则,被擦除为Object。
  • 重载和重写区别?实现泛型接口后将方法里的T替换为String是否算重写?为什么?

实现泛型接口后将方法里的T替换为String是方法重写

  1. 什么是双亲委派机制?
    当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
  2. 双亲委派的作用?
  • 防止类的重复加载:通过委托去询问上级是否已经加载过该.class,如果加载过了,则不需要重新加载,保证了数据安全。
  • 防止破坏核心类:通过委托的方式,保证核心.class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。
  1. 打破双亲委派的场景
    典型的打破双亲委派模型的框架和中间件是tomcat和osgi。打破双亲委派的作用:为了实现各目录下类的隔离。 alt Tomcat中可以部署多个web项目,为了保证每个web项目互相独立,所以不能都由AppClassLoader加载,所以自定义了类加载器WebappClassLoaderWebappClassLoader继承自URLClassLoader,重写了findClassloadClass,并且WebappClassLoader的父类加载器设置为ExtClassLoaderWebappClassLoader.loadClass中会先在缓存中查看类是否加载过,没有加载就获取其父类加载器,类加载交由ExtClassLoaderExtClassLoader再交给BootstrapClassLoader加载;都加载不了,才自己加载;自己也加载不了,就遵循原始的双亲委派,交由AppClassLoader递归加载。
  • 拥塞控制过程

慢开始、拥塞避免、快重传和快恢复

  • TCP可靠连接(三次握手、四次回收过程)?第二次握手时为什么要ACK+SYN?

  • 普通IO和NIO的区别?

参考:IO和NIO的区别 alt

  • 什么是IO多路复用?

Selector Buffer Channel

  • 线程的通信方式?命名管道和匿名管道的区别?
  1. 线程通信方式:管道、信号、信号量、消息队列、共享内存、套接字
  2. 命名管道和匿名管道的区别:
  • 管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
  • 有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
  1. MySQL联合索引遵循最左前缀匹配规则,即从联合索引的最左列开始向右匹配,直到遇到匹配终止条件。例如联合索引(col1, col2, col3), where条件为col1=a AND col2=b可命中该联合索引的(col1,col2)前缀部分, where条件为col2=b AND col3=c不符合最左前缀匹配,不能命中该联合索引。
  2. 匹配终止条件为范围操作符(如>, <, between, like等)或函数等不能应用索引的情况。例如联合索引(col1, col2, col3), where条件为col1=a AND col2>1 AND col3=c, 在col2列上为范围查询,匹配即终止,只会匹配到col1,不能匹配到(col1, col2, col3).
  3. 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数据库的功能
  • 算法题:链表区间反转