B站
笔试
题型
- 20道单选
- 5道多选
- 2道编程
问题
-
DNS用UDP
-
代理模式是一种设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。
-
在Java编程中,理解类的初始化顺序是非常重要的,尤其是在涉及到继承时。类的初始化顺序可以影响变量的赋值以及构造函数的执行。在Java中,类的初始化顺序遵循以下规则:
- 静态变量和静态初始化块:首先初始化静态变量和静态初始化块,它们按照在类中出现的顺序执行。静态初始化只在类加载时进行一次。
- 实例变量和普通初始化块:接着初始化实例变量和普通初始化块,它们也按照在类中的声明顺序执行。这些在每次创建类的实例时都会执行。
- 构造函数:最后执行构造函数,构造函数总是在所有字段初始化之后执行。
对于继承的情况,初始化顺序如下:
- 父类静态变量和静态初始化块:在子类加载之前,首先加载父类,因此父类的静态字段和静态初始化块会首先初始化。
- 子类静态变量和静态初始化块:加载子类时,初始化子类的静态字段和静态初始化块。
- 父类实例变量和普通初始化块:当使用子类构造函数创建对象时,首先初始化父类的实例变量和普通初始化块。
- 父类构造函数:执行父类的构造函数。
- 子类实例变量和普通初始化块:然后初始化子类的实例变量和普通初始化块。
- 子类构造函数:最后执行子类的构造函数。
-
EXPLAIN的type字段?
-
- const:常量连接
- eq_ref:主键索引 (primary key)或者非空唯一索引 (unique not null)等值扫描
- ref:非主键非唯一索引等值扫描
- range:范围扫描
- index:索引树扫描
- ALL:全表扫描 (full table scan)
-
-
哪些排序稳定,哪些排序不稳定?
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法。
- 冒泡排序、插入排序、归并排序、基数排序是稳定的排序算法。
-
前序线索化?
-
try-catch-finally
try
块
-
作用:
try
块中包含可能会抛出异常的代码。 -
特点:
- 如果代码正常执行,不会抛出异常,则程序继续执行
try
块之后的代码。 - 如果代码抛出异常,则程序会暂停执行
try
块中的后续代码,转而查找匹配的catch
块来处理异常。
- 如果代码正常执行,不会抛出异常,则程序继续执行
catch
块
-
作用:
catch
块用于捕获并处理try
块中抛出的异常。 -
特点:
- 每个
catch
块指定了一种异常类型(如ExceptionType1
、ExceptionType2
等),只能捕获与之匹配的异常。 - 如果
try
块中抛出的异常与某个catch
块的异常类型匹配,则执行该catch
块中的代码。 - 可以有多个
catch
块,用于捕获不同类型的异常。捕获顺序很重要,子类异常必须放在父类异常之前,否则会报错。 - 如果没有匹配的
catch
块,则异常会被向上抛出到调用栈的上一层。
- 每个
finally
块
-
作用:
finally
块中的代码无论是否捕获到异常都会执行。 -
特点:
- 通常用于清理资源,如关闭文件流、释放数据库连接等。
- 即使在
catch
块中使用了return
语句,finally
块仍然会执行(但return
的值会在finally
块执行完毕后再返回)。 - 如果
try
或catch
块中发生了System.exit()
,则finally
块不会执行。 - 如果
try
块中发生了return
或throw
,finally
块仍然会执行,但return
的值或异常会在finally
块执行完毕后再继续处理。
-
volatile
关键字在多线程编程中用于确保变量的可见性,但它并不保证线程安全。 -
MySQL的InnoDB存储引擎默认采用的是REPEATABLE-READ(可重复读)隔离级别。
-
Redis 目前支持三种 AOF 保存模式
-
Always
,同步写回:每个写命令执行完,立马同步地将日志写回磁盘 -
Everysec
,每秒写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘 -
No
,操作系统控制的写回:每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
-
-
时钟中断是一种外部中断?
时钟中断(Clock Interrupt)是计算机系统中一种非常重要的中断类型,它由系统的硬件时钟(也称为定时器)产生。时钟中断是操作系统实现多任务调度、时间管理、进程超时控制等功能的基础机制。
1. 时钟中断的定义
时钟中断是系统时钟(或定时器)定期触发的中断信号。系统时钟以固定的时间间隔(称为时钟周期或滴答率)发出中断请求,操作系统会响应这些中断请求,执行相应的中断处理程序。
2. 时钟中断的作用
-
多任务调度:
- 时钟中断是实现多任务操作系统的核心机制之一。操作系统利用时钟中断来实现时间片轮转(Round Robin)调度算法。每当一个时钟中断发生时,操作系统会检查当前运行的进程是否已经用完了分配给它的CPU时间片。如果用完,则暂停当前进程,切换到另一个就绪的进程运行。
- 例如,假设系统时钟的滴答率为 100 次/秒,即每 10 毫秒产生一次时钟中断。操作系统可以将每个时间片设置为 10 毫秒,这样每个进程最多运行 10 毫秒后就会被挂起,让其他进程运行,从而实现多任务并发执行的效果。
-
时间管理:
- 时钟中断用于维护系统时间。操作系统通过时钟中断来更新系统时间,确保系统时间的准确性。
- 例如,操作系统可以利用时钟中断来更新系统时钟,每秒增加一秒。
-
进程超时控制:
- 时钟中断可以用于实现进程的超时控制。例如,当一个进程执行 I/O 操作时,操作系统可以设置一个超时时间。如果在超时时间内 I/O 操作没有完成,时钟中断会触发,操作系统可以采取相应的措施,如终止进程或重新调度。
-
资源管理:
- 时钟中断可以帮助操作系统进行资源管理。例如,操作系统可以通过时钟中断来统计每个进程的CPU使用时间,从而实现公平的资源分配。
3. 时钟中断的处理
-
中断处理程序:
-
当时钟中断发生时,操作系统会执行一个中断处理程序(Interrupt Handler)。这个处理程序通常会执行以下任务:
- 更新系统时间:根据时钟中断的频率更新系统时间。
- 进程调度:检查当前运行的进程是否用完时间片,如果用完则进行上下文切换。
- 资源管理:更新进程的CPU使用时间统计信息。
- 超时检查:检查是否有进程的I/O操作超时。
-
4. 时钟中断的频率
-
时钟中断的频率(滴答率)因操作系统和硬件平台而异。常见的滴答率包括:
- 100 次/秒:每 10 毫秒产生一次时钟中断,适用于早期的Windows和Linux系统。
- 1000 次/秒:每 1 毫秒产生一次时钟中断,适用于高精度的实时系统。
-
较高的时钟中断频率可以提供更精确的时间控制和更细粒度的进程调度,但也会增加系统的开销。
5. 时钟中断与硬件时钟
-
硬件时钟:
- 硬件时钟(或定时器)是时钟中断的来源。它是一个硬件设备,能够以固定的时间间隔产生中断信号。
- 在现代计算机系统中,硬件时钟通常是一个独立的芯片,如 Intel 的APIC(Advanced Programmable Interrupt Controller)。
-
时钟中断的触发:
- 硬件时钟在每个时钟周期结束时向CPU发送一个中断请求信号(IRQ)。CPU接收到中断请求后,会暂停当前的执行,切换到中断处理程序。
- CMS对老年代的处理是标记清除算法?
- Bean加载的方式?
- 索引失效的情况?
1. 模糊查询导致索引失效
- 问题:使用
LIKE '%xx'
或LIKE '%xx%'
进行模糊查询时,索引失效。 - 原因:B+树索引只能根据前缀进行比较,无法处理前缀为通配符的情况。
- 解决方案:尽量使用前缀匹配(如
LIKE 'xx%'
),或者对特定场景使用全文索引。
2. 索引列使用函数或表达式
- 问题:在查询条件中对索引列使用函数(如
LENGTH(name)
)或表达式(如age + 1
)时,索引失效。 - 原因:索引保存的是字段的原始值,而不是经过函数或表达式计算后的值。
- 解决方案:避免在索引列上使用函数或表达式,或者在 MySQL 8.0+ 中使用函数索引。
3. 隐式类型转换
- 问题:当查询条件中索引列的数据类型与输入参数不匹配时,MySQL 会进行隐式类型转换,导致索引失效。
- 原因:隐式类型转换相当于在索引列上使用了函数。
- 解决方案:确保查询条件中的数据类型与索引列的数据类型一致。
4. 联合索引未遵循最左前缀原则
- 问题:联合索引未按照最左前缀原则使用时,索引失效。
- 原因:联合索引需要从最左边的列开始匹配。
- 解决方案:遵循最左前缀原则,确保查询条件包含联合索引的最左列。
5. 使用 **OR
连接多个条件**
- 问题:在查询条件中使用
OR
连接多个条件时,如果其中一个条件无法利用索引,整个查询可能会导致索引失效。 - 解决方案:将包含
OR
的查询拆分成多个独立查询,然后使用UNION
或UNION ALL
合并结果。
6. NOT EXISTS
查询
- 问题:使用
NOT EXISTS
查询时可能导致索引失效。 - 解决方案:考虑重写查询,使用
LEFT JOIN
来替代NOT EXISTS
。
7. ORDER BY
排序不当
- 问题:
ORDER BY
子句中的列未被索引覆盖时,索引失效。 - 解决方案:创建合适的索引,确保
ORDER BY
子句中的列被索引覆盖。
8. 索引列存在大量重复值
- 问题:索引列上存在大量重复值时,索引可能失效。
- 原因:索引的区分度低,使用索引的性能提升不明显。
- 解决方案:考虑使用其他字段作为索引,或者调整查询逻辑。
9. 表中数据量较少
- 问题:当表中的数据量较少时,数据库可能会选择全表扫描而不是利用索引。
- 原因:全表扫描的开销相对较小。
- 解决方案:无需特别处理,但可以监控查询性能。
10. 索引列上有过多的 **NULL
值**
- 问题:索引列上存在过多的
NULL
值时,索引可能失效。 - 解决方案:尽量避免在索引列上存储大量
NULL
值。
- 抽象类和接口的区别?
抽象类不可以直接实例化。
接口可以实现多继承。一个类可以实现多个接口;一个接口也可以继承多个接口。