这是第二天,希望自己可以坚持住,安利一个面试复习资料
https://blog.csdn.net/qq_41901915/article/details/103672370
话不多说,上题!!!
1.ThreadLocal 类的底层实现是怎么实现的?使用场景 是什么?
暂略
3.list 如何实现的异步消息队列?
暂略
4.Redis 在单线程下实现高并发的?核心的机制是什么?
限制redis的瓶颈不是CPU,而是网络带宽和内存大小。
5.为什么 Redis 会这么快?
(1)纯内存操作,避免大量访问数据库,减少直接读取磁盘数据,redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快;
(2)单线程操作,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
(3)采用了非阻塞I/O多路复用机制。
(4)灵活的数据结构。
(5)持久化,AOF和RDB。
6.写JAVA后端,客户说系统慢,怎么排查 ?
从数据库角度:是否用了什么查询较慢,数据量巨大的语句。
从JVM角度:是否因为jvm的参数不合适,使得产生大量的GC。
7.面试时的算法题的结构都是没有定义好的需要自己定义与构建,如链表,树什么的。
在此就不举例了,希望自己和读者以后刷题的时候注意一下构建的部分。
8.TCP粘包是什么?
简单的来说就是没有控制好边界,导致两个包连在了一起。
9.TCP服务端如何保证失序的包按序到达 ?
TCP为每个包分配了序列号。
10.索引为什么能加快查询效率 ?
索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。
一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。
索引的缺点:索引是有大量数据的时候才建立的,没有大量数据反而会浪费时间
12.什么是CAS机制?
参考https://www.cnblogs.com/myopensource/p/8177074.html
13.java线程池?
简单来说就是存放线程的一个池子,用的时候就从里面拿,不用的时候就放回去。
好处:请求时,线程已经存在,减少了相应的时间。另外,适当调整线程数也可以防止出现资源不足的情况。
说明:
我们知道不用线程池的话,每个线程都要通过new Thread(xxRunnable).start()的方式来创建并运行一个线程,线程少的话这不会是问题,而真实环境可能会开启多个线程让系统和程序达到最佳效率,当线程数达到一定数量就会耗尽系统的CPU和内存资源,也会造成GC频繁收集和停顿,因为每次创建和销毁一个线程都是要消耗系统资源的,如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。
14.linux的指令也要有所熟悉,比如只写一行指令找出所有python程序并Kill ?
ps命令查找进程PID再用kill命令终止进程的方法。
15.海量数据的排序?
这个地方我查了一些网上的解答,没有找到什么让我很满意的,但大都推荐快速排序和堆排序。
16.接口和抽象类有什么区别?
类型 | abstract class | Interface |
---|---|---|
定义 | abstract class关键字 | Interface关键字 |
继承 | 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 | 接口只可以继承接口(一个或多个);子类可以实现多个接口 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符 |
方法实现 | 可定义构造方法,可以有抽象方法和具体方法 | 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现 |
实现方式 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
作用 | 了把相同的东西提取出来,即重用 | 为了把程序模块进行固化的契约,是为了降低偶合 |