历年面经总结

快手篇

数据结构

  • 说说B+树和B树的区别,优缺点等?

B 树每个节点都有存储 Date域,并且 B 树的叶子节点并没有用链表连接,但是 B+ 树每个非叶子节点只有索引值和指针域,并不存储 Date域,并且其叶子节点存储 Date 用链表连接,B树的话比平衡二叉树「是一棵空树或它的左右两个子树的高度差的绝对值不超过1』而言,增加和删除节点改动很少,效率高,B+是为了数据库而生的,其链表可以更好的支持范围查询,并且由于他的非叶子节点是不存储 Date域的,我们知道,每一个节点都是采用的磁盘预读,也就是说一个节点占用一页的数据,这样的话B+ 在一页中可以存储更多的指针域,这样就大大降低了树的高度,这样磁盘读写的次数就下降了,非常好。

  • 经有一个查询好友的接口,设计一个微信朋友圈,可以实现发表朋友圈,添加评论,查看评论等功能。主要是设计数据结构

操作系统

计算机网络

  • TCP三次握手四次挥手,四次挥手过程中服务端的哪几种状态,哪几种包

三次握手:客户端发一个 syn 服务器端发一个 syn ack 然后客户端发一个ack

四次挥手:客户端发一个 fin 服务器端发送一个 ack 然后发送一个 fin 然后客户端再发送一个ack

算法

  • 算法题:无序数列中求第k大的数(维护最小堆,然后依次遍历,与堆顶比较
  • 写一个选择排序或者插入排序
  • 写一个生产者消费者
「Get!!!」

三种方法。

  1. synchronized(Object)的 wait/notify;
  2. ReentrantLock 中的 Condition 的 await/signal;
  3. 阻塞队列直接实现:LinkedBlockingQueue
  • 一个二维矩阵进行逆置操作,也就是行变列列变行。扩展一下,二维数组存在500g的文件中,怎么做才能完成上面算法的操作,我就说先按行拆分,最后再拼接。

java基础

  • HashMap的底层数据结构
「Get!!!」

红黑树+链表+数组

  • HashMap哈希函数的认识,JDK1.8采用的hash函数
「Get!!!」

扰动函数,高16位和低16位相异或,32位都参与运算,这样hash更均匀

至于如何计算所在的数组位置,直接 hash ^ tab.length 相与

多线程

  • Q:多线程JUC包下的一些常见的类,比如CountDownLatch、Semaphore等

    「Get!!!」

    CountDownLatch 倒计时器

    Semphore 信号量

  • Q:锁的概念,锁相关的关键字,volatile,synchronized。还比较了ReentrantLock与synchronized。

    「Get!!!」

    ReentrantLock & syncronized 区别

    • ReentrantLock 有三个 syncronized 没有的特性,第一个是 条件队列可以有多个,Condition 可以分组,但是 syncronized 不可以;第二个是 ReentrantLock 提供 公平锁 和 非公平锁的选择,但是 syncronized 不提供;第三个是 ReentrantLock有 lockInterruptibly() 方法,提供优先响应中断,就是当线程正在等待时,可以调用这个等待线程的 Thread.interrupt(),停止等待,直接返回。
    • ReentrantLock 是一个类,jdk层面实现,而 syncronized 则是 jvm层面实现,是一个关键字;
    • 当然了,都是可重入锁,而且现在 syncronized 的性能已经基本持平 ReentrantLock 了。
  • Q:线程池有哪些参数?分别有什么用?如果任务数超过的核心线程数,会发生什么?阻塞队列大小是多少?

    「Get!!!」

    线程池的参数有 corePoolSize(线程池核心数)、线程最大数(maxmiumPoolSize)、阻塞队列(worQueue)、keepAliveTime(线程池维护线程所允许的空闲时间)、线程工厂(ThreadFactory)、拒绝策略(handler)。如果任务数超过核心线程数,会先将任务放到阻塞队列中,然后如果阻塞队列满,则扩大线程。阻塞队列大小分为无界阻塞队列和有界阻塞队列。

  • Q:在高并发的情况下,我们怎么选择最优的线程数量呢?选择原则又是什么呢?线程数是不是越多越好?

    「Get!!!」

    选择线程池的数量需要从 CPU 的角度考虑,因为考虑一个系统的吞吐量上限就是CPU,充分利用 cpu 是关键。CPU密集型应用,则线程池大小设置为N+1(由于cpu很忙,所以额外的切换上下文非常的消耗资源,所以一个线程干活对应一核cpu即可,多的那一个是为了防止某个线程失败或者挂起导致浪费cpu时钟),IO密集型,线程池大小是 2N+1,准确的说是 最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目,混合型的话就将二者结合就好。当然,要想提高系统吞吐量,真正的是要去解决短板效应,也就是 I/O,可以将其变为 NIO 之类的。

    线程数肯定不是越多越好,首先 cpu 就那几个,并行的也就那几个,加上切换线程上下文也是需要消耗的。

https://www.cnblogs.com/jpfss/p/10967703.html

  • Q:有哪些比较好的线程池,各自的特点是什么?

    「Get!!!」

四大线程池

下面有写

  • Q:怎么实现一个线程安全的计数器?

    「Get!!!」

使用加锁的方式,synchronized or ReentrantLock 都可以,或者使用 juc 包下的 Atomic 原子类也是可以的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> public class Count1 {
> // 1. 使用 synchronized,用不用 volatile 都是可以的
> private static int a = 0;
>
> public static void main(String[] args) {
> final ExecutorService executorService = Executors.newCachedThreadPool();
> // 启动1000个线程
> for (int i = 0; i < 1000; i++) {
> executorService.execute(() -> count());
> }
> executorService.shutdown();
> System.out.println(a);
> }
> private static synchronized void count() {
> a++;
> }
> }
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
> class Count2 {
> // 1. 使用 volatile + ReentrantLock
> // 不用 volatile 也是可以的
> private static int a = 0;
> private static final ReentrantLock lock = new ReentrantLock();
>
> public static void main(String[] args) {
> final ExecutorService executorService = Executors.newCachedThreadPool();
> // 启动1000个线程
> for (int i = 0; i < 1000; i++) {
> executorService.execute(() -> count());
> }
> executorService.shutdown();
> System.out.println(a);
> }
>
> private static void count() {
> try {
> lock.lock();
> a++;
> } finally {
> lock.unlock();
> }
>
> }
> }
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> class Count3 {
> // 1. 直接使用 Atomic就可以了
> private static AtomicInteger a = new AtomicInteger(0);
>
> public static void main(String[] args) {
> final ExecutorService executorService = Executors.newCachedThreadPool();
> // 启动1000个线程
> for (int i = 0; i < 10000; i++) {
> executorService.execute(() -> a.getAndIncrement());
> }
> executorService.shutdown();
> System.out.println(a.get());
> }
> }
>
  • 接着聊ConcurrentHashMap,底层实现
「Get!!!」

底层实现?

红黑树+数组+链表

  • Java多线程了解么,什么时候一个int,类型的操作是不安全的,自加呢,赋值呢。如果使用volatile修饰的话有什么作用。
「Get!!!」

自加,不安全;赋值,安全。因为前者有读和写两个操作,后者只有写操作

用volatile 也一样,volatile不能保证原子性,可以使用加锁或者使用 Atomic原子类。

  • 有一个场景,多线程并发,为每个线程安排一个随机的睡眠时间,设想一种数据结构去唤醒睡眠时间结束的线程,应该用哪种结构
「Get!!!」

应该用优先级队列,也就是小顶堆,顶部是剩余睡眠时间最短的那个线程。PriorityQueue。

JVM

  • 你了解哪些收集器?CMS和G1。详细谈谈G1的优点?什么时候进行Full GC呢?

Serial Serial Old ParNew Parllelscatw。。。 parallelOld CMS G1

G1优点:

不区分新生代和老年代,是连续的空间,然后是一个一个rezone进行管理,有一个优先级的排序,就是会把这个rezone垃圾最多的先回收,然后是采用的标记整理解决内存的碎片问题,兼顾了 CMS 低延迟的一个特性和 Parallel Scavenge 高吞吐率的特性。

老年代区域满了不就 Full GC 了吗…

消息中间件

spring全家桶

  • Spring中涉及的一些设计模式
  • 聊聊Spring,主要IOC等等

数据库

  • MySQL创建索引的原则,好处
  • 数据库索引,索引底层的实现,B+树的结构以及与普通查找树的优点
  • MySQL和redis的区别是什么
  • 为什么MySQL和Redis都要使用独立进程来部署,开放端口来提供服务,为什么不写在内核中。

其他

  • 设计模式:讲了单例,工厂方法,抽象工厂,策略模式,观察者模式,代理模式,还顺便讲了下spring动态代理的实现原理
  • 红黑树的具体结构及实现,红黑树与查找树的区别体现

这个我会…复习一波

  • 项目中用到dubbo?那你说说什么是rpc框架?和http调用的区别是什么?
  • Redis有哪些数据结构?持久化方案和区别?
  • Redis哨兵、集群的设计原理和区别?
  • Redis缓存和数据库会存在一致性问题吗?怎么解决
  • Kafka怎么保证数据可靠性?讲了生产者端发送消息到broker持久化,分区和副本机制,消费者消费消息的at-least-once和at-most-once?怎么实现Exactly-Once?

字节篇

数据结构

操作系统

  • 用户态如何切换到内核态
  • 进程间通信的方式,哪种最快

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

1.进程与线程

进程:具有独立功能的程序关于某个数据集合上的一次运行活动。
线程:进程的一个实体。
比喻:一列火车是一个进程,火车的每一节车厢是线程。

2.进程与线程的联系

①一个线程只能属于一个进程,一个进程可以有多个线程;
②系统资源分配给进程,同一进程的所有线程共享该进程的所有资源;
③真正在处理机上运行的是线程;
④不同进程的线程间利用消息通信的方式实现同步。

3.进程与线程的区别

①调度:线程是系统调度和分配的基本单位,进程是作为拥有系统资源的基本单位;
②并发性:进程之间可以并发执行,同一进程的多个线程时间亦可以并发执行;
③拥有资源:进程是拥有资源的独立单位,线程不拥有资源,但可以访问隶属于进程的资源;
④系统开销:创建和撤销进程的开销更大;进程拥有独立的地址空间,一个进程的崩溃不会影响其他进程;线程拥有自己的堆栈和局部变量,没有独立的地址空间,因此进程里的一个线程崩溃会导致其他线程均崩溃。

4.进程间通信方式

进程间通信方式有很多,网上一说有十几种。面试的时候说上以下几种差不多:
①管道:半双工的通信方式,数据只能单向流动,且只能在有亲缘关系(父子进程或兄弟进程)的进程间使用;
②命名管道:FIFO,半双工的通信方式,但允许在无亲缘关系的进程间通信;
③消息队列:消息的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点;
④信号量:是一个计数器,用于控制多个进程间对共享资源的访问;
⑤共享内存:映射一段能被其他进程访问的内存,这段内存由一个进程创建,但多个进程都可以访问;「最快,可以联系到零拷贝把 mmap」
⑥套接字

5.线程间通信方式

多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。就是多个线程在操作同一份数据时, 避免对同一共享变量的争夺。
①锁机制:包括互斥锁、条件变量、读写锁

互斥锁提供了以排他方式防止数据结构被并发修改的方法。
读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
②信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
③信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
————————————————
版权声明:本文为CSDN博主「冯Jungle」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_21107433/article/details/82809946

  • 信号量怎么实现对共享资源的访问
「Get!!!」

semphore,共享锁加一个访问数量的限制,主体还是 AQS 的共享锁实现,超过了信号量的值就加入等待队列等待,这里的等待队列就是一个普通的 Queue,不像AQS中的 CLH 队列。

  • select和epoll

在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并发的场景下,nginx越来越收到欢迎。

(1)select==>时间复杂度O(n)

它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

(2)poll==>时间复杂度O(n)

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.

(3)epoll==>时间复杂度O(1)

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

计算机网络

  • TCP的流量控制和拥塞控制

一、流量控制

1.什么是流量控制

Sender won’t overflow receiver’s buffer by transmitting too much, too fast. (防止发送方发的太快,耗尽接收方的资源,从而使接收方来不及处理)
2.流量控制的一些知识点

(1)接收端抑制发送端的依据:接收端缓冲区的大小
(2)流量控制的目标是接收端,是怕接收端来不及处理
(3)流量控制的机制是丢包
3.怎么样实现流量控制?

使用滑动窗口
滑动窗口
1.滑动窗口是什么?
滑动窗口是类似于一个窗口一样的东西,是用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小,这样就可以实现
ps:窗口指的是一次批量的发送多少数据
2.为什么会出现滑动窗口?

在确认应答策略中,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段,这样做有一个比较大的缺点,就是性能比较差,尤其是数据往返的时间长的时候
使用滑动窗口,就可以一次发送多条数据,从而就提高了性能
3.滑动窗口的一些知识点

(1)接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK来通知发送端
(2)窗口大小字段越大,说明网络的吞吐率越高
(3)窗口大小指的是无需等待确认应答而可以继续发送数据的最大值,即就是说不需要接收端的应答,可以一次连续的发送数据
(4)操作系统内核为了维护滑动窗口,需要开辟发送缓冲区,来记录当前还有那些数据没有应答,只有确认应答过的数据,才能从缓冲区删掉
ps:发送缓冲区如果太大,就会有空间开销

二、拥塞控制

慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。

「乘法减少,加法增加」

三、流量控制和拥塞控制的区别
1.相同点

(1)现象都是丢包;
(2)实现机制都是让发送方发的慢一点,发的少一点
2.不同点

(1)丢包位置不同
流量控制丢包位置是在接收端上
拥塞控制丢包位置是在路由器上
(2)作用的对象不同
流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理
拥塞控制的对象是网络,怕发送发发的太快,造成网络拥塞,使得网络来不及处理
3.联系
拥塞控制
拥塞控制通常表示的是一个全局性的过程,它会涉及到网络中所有的主机、
所有的路由器和降低网络传输性能的所有因素
流量控制
流量控制发生在发送端和接收端之间,只是点到点之间的控制

————————————————
版权声明:本文为CSDN博主「dangzhangjing97」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dangzhangjing97/article/details/81008836

  • 不同子网可以通过ARP获取mac地址吗
  • 浏览器中输入网址到获得页面的全过程
  • 输入 www.baidu.com,怎么变成 https://www.baidu.com 的,怎么确定用HTTP还是HTTPS
  • 三次握手
  • 握手时产生的序列号干什么用的
  • 讲一下接收窗口
  • TCP和UDP的本质区别
  • 什么时候选择TCP/UDP
  • HTTPS的连接过程
  • 7层模型和4层模型,每一层有哪些常见协议?
  • 路由器/交换机是哪一层
  • 网络层用来干嘛?传输层用来干嘛?
  • HTTP可以使用UDP吗
  • HTTPS怎么确认收到的包就是服务器发来的
  • 确定发送窗口的大小,如何最大利用带宽,假设延迟100ms,发送端10Mb/s,接收端100Mb/s
  • 网络五层模型,每一层分别有哪些协议
  • ICMP,TCP,IP,HTTP分别是哪一层,为什么网络模型要分层,每一层之间怎么传递
  • http头里的gzip
  • 反向***说一下
  • 三次握手,为什么要三次,每一次分别确认了什么
  • TCP协议的三次握手和四次挥手过程?
  • Tcp怎么保证可靠的
  • 确认重传机制;
  • 流量控制,滑动窗口协议
  • 拥塞控制:慢启动、拥塞避免、快重传、快恢复

算法

  • 求x的y次方,想出比直接for循环更好的方案
  • 求绝对众数
  • 算法题:红蓝两种球,总共N个, N>2, 排列组合,连续3个颜色一样是非法的,求合法的排列数量
  • 描述一下堆排的过程?建堆的时间复杂度?最大堆中求前k个最大值的时间复杂度?
  • 算法题:海岛面积计算题,给一个矩阵,0表示海水,相连的1表示海岛,上下左右表示相连。
    00011
    11011
    10001
    (1)求最大海岛面积。
    (2)求最大海岛面积和对应海岛的所有坐标。
    (3)求所有海岛的所有坐标,按海岛分。
    每小题讲思路,最后写第二题。

java基础

  • Bean的默认作用范围是什么?其他的作用范围?
  • 平常用线程主要是怎么写的,会用一些线程框架吗?(没有用框架)Java线程池的概念?线程池有哪些?线程池工厂有哪些线程池类型,及其线程池参数是什么?

用线程都可以啊,线程池 or 直接 new Thread

线程框架 Executor中的 ThreadPoolExecutor、FutureTask

Fork-join

Exchanger

Semphore

CycliBarrier

CountDownLatch

线程池的概念:就是会复用一堆线程

四个主要使用的线程池,

newFixedThreadPool是一个典型且优秀的线程池,它具有线程池的高效率和节省创建线程时所耗的开销的优点。但是在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。但是注意其只有核心线程池,在线程池中没有额外的线程。使用的是 LinkedBlockingQueue。我不知道为什么还要指定核心线程数和最大线程数一致,这里的 LinkedBlockingQueue 明明就是无界的,也就是说不可能会去使用到核心线程以外的线程。

newCachedThreadPool的特点就是在线程池空闲时,即线程池中没有可运行任务时,它会释放工作线程,从而释放工作线程所占用的资源。但是当出现新任务时,又要创建新的工作线程,这会带来一定的系统开销。并且在使用CachedThreadPool时,一定要注意控制任务的数量,否则大量线程同时运行,可能会造成系统瘫痪。使用的是 SynchronousQueue。因为他是无界的,其实也是空队列,线程数没有限制,任务来了,如果没有空闲线程,直接new 一个线程。corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE。

newScheduledThreadPool是周期线程池。支持定时及周期性任务执行。使用的是 DelayBlockingQueue。

newSingleThreadPool是一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。当然如果当前线程死了,会新建一个重新执行任务。将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue

  • ConcurrentHashMap讲一讲?

讲什么…简单的要死的东西哈哈哈哈哈哈哈…好叭这种问题好没意思

  • Java bin包下面的工具用过哪些?
  • 同步IO和异步IO的区别?
  • 线程如何实现同步?

synchronized lock

  • ConcurrentHashMap 在Java7和Java8中的区别?为什么Java8并发效率更好?什么情况下用HashMap,什么情况用ConcurrentHashMap?

因为锁粒度更加细粒度了,并且使用了轻量级锁、偏向锁。

线程安全使用 ConcurrentHashMap,线程不安全使用 HashMap

  • 加锁有什么机制?

Synchronized lock

  • ThreadLocal?应用场景?

线程局部变量,应用场景为变量是线程间隔离,线程内全局变量使用,而且还可以做到局部变量做不到的,也就是可以跨线程通信。 Spring 单例bean、hibernate中的session等等都使用了 ThreadLocal。

多线程

JVM

  • Java GC机制?GC Roots有哪些?

消息中间件

spring全家桶

  • 微服务注册发现,为什么用微服务,grpc,protobuf,dubbo讲一下
  • IoC是什么概念?
  • Web容器用的什么?你项目里涉及了SSM框架,一个请求到Tomcat容器了,怎么到SSM代码中去?

数据库

  • 事务的四大特性

原子性、隔离性、

  • 四种隔离级别
  • 什么是幻读
  • InnoDB 怎么防止幻读
  • B+树原理,为什么使用B+而不是二叉平衡树
  • 1000万个object的文件,有ABC三个date member,怎么根据ABC的条件查询比较快
  • 联合索引
  • 索引是什么概念有什么作用?MySQL里主要有哪些索引结构?哈希索引和B+树索引比较?
  • MySQL了解到什么程度?binLog知道吗?

其他

  • redis分布式锁两种实现
  • 怎么理解微服务
  • 什么是Python生成器,迭代器;
  • 什么是装饰器;
  • 浏览器缓存、CPU的缓存和Redis的缓存的关系,为什么要有缓存
  • 元组和list的区别;
  • Python中的dict底层怎么实现的
  • list的底层怎么实现的;
  • 双等于和is有什么区别
  • JSON和protobuf区别
  • BloomFilter干嘛的,解决了什么问题
  • REST api和RPC
  • 为什么protobuf效率更高,JSON缺点
  • 1000万条相同class格式object组成的json,怎么压缩
1
2
3
4
5
6
7
8
9
设计题:一个数据库存了以下数据:用户id,登录时间,登出时间;如何找到一天当中的用户峰值(用一个hash map存所有秒数的在线人数)

为什么要分用户态和内核态

Git 切换分支,提交,具体如何合并分支

Python多线程用了几个CPU

算法:二叉树,输出所有和为n的路径(可以从中间结点到中间结点)

阿里

数据结构

操作系统

计算机网络

算法

  • 红黑树、二叉树的算法

java基础

  • Servlet规范了解吗?Servlet的整个业务流程?session和cookie的区别?session怎么变成cookie,怎么变回session?谁来实现整个流程?
  • 刚才提到的分布式实现多个应用的Session共享问题?

多线程

JVM

消息中间件

spring全家桶

  • 项目提到的SSM框架里面了解哪些?Spring IoC中Bean的生命周期?谁来管理Bean的生命周期?BeanFactory和ApplicationContext的关系?@Autowired和@Resource的区别? Spring的自动扫描怎么实现的?谁实现的?
  • MyBatis介绍一下?你说到这是一个持久层框架,那你了解JPA规范吗?

数据库

其他

  • UML了解吗?(不会)设计模式?
  • Zookeeper了解吗?
  • 单例模式、工厂模式、***模式……单例模式有什么需要注意的吗?(多线程并发问题:synchronized+volatile)你写单例的时候如果这个单例对象有字段值,你会去改变这些字段值吗?为什么呢?

鹅厂

数据结构

操作系统

计算机网络

  • http三次握手四次挥手
  • HTTP常见错误码?TCP三次握手?

算法

  • 海量数据寻找TopK

  • 海量数据排序

    16G的文件储存的是一个数组,要求只用1G内存把他们排好序。

  • 排序算法了解哪些?Java里内置的是用什么排序方法?快排是稳定的吗?快排排对象的时候有什么问题?(提示我,三个字段,第一个字段和第二个字段做hash,第三个不做,还是不太懂)

  • 十亿个IP,获得访问次数最多的十个。

  • 五个单词,在一个长文本中查找是否存在。

  • 快速排序算法

java基础

  • Java中各种锁聊一下,CAS机制。
  • stl说一下,map原理,时间复杂度
  • HashMap有了解吗?HashMap的时间复杂度?HashMap中Hash冲突是怎么解决的?链表的上一级结构是什么?Java8中的HashMap有什么变化?红黑树需要比较大小才能进行插入,是依据什么进行比较的?其他Hash冲突解决方式?
  • 实现线程安全的方式?ThreadLocal原理?线程池了解吗说说看?自己用线程池怎么定参数?

多线程

  • volatile有用过么,底层实现,这个问题是讲到了CPU填充缓存行指令。
  • Java线程池

JVM

  • GC回收器JVM调优参数配置
  • JJava堆中怎么分区?怎么判断对象是否需要回收?Java内存占用过大怎么查看?Java内存溢出有碰到过吗?Java内存溢出怎么定位?

消息中间件

spring全家桶

数据库

  • 数据库的事务隔离级别,mvcc机制聊一下。
  • 数据库索引,B+树结构和特点。怎么进行优化
  • mysql间隙锁为了解决什么问题,什么条件下会触发。
  • MySQL数据库引擎?应用场景?查询优化?NoSQL有用或了解吗?

其他

  • 红黑树,AVL树,查询时间复杂度,什么情况下用红黑树而不用map

  • 进程和线程的区别?平常的开发环境是Windows还是Linux?Linux命令知道哪些?要在多个文本文件中找一个关键词用什么命令?(grep)网络相关的命令是什么?

度娘

数据结构

操作系统

计算机网络

算法

java基础

多线程

JVM

消息中间件

spring全家桶

  • springboot和spring比有什么优点
  • springboot自动配置原理

数据库

  • 高并发数据库大表优化,分库分表,水平怎么拆,垂直怎么拆
  • 知道哪些索引,索引数据结构
  • 联合索引规则
  • 数据库怎么优化,查询性能瓶颈怎么查(explain)

其他

美团

数据结构

操作系统

计算机网络

算法

java基础

多线程

JVM

消息中间件

spring全家桶

数据库

其他

拼夕夕

数据结构

  • 二叉树的后序遍历,非递归算法。

操作系统

计算机网络

  • TCP三次握手的过程,如果没有第三次握手有什么问题。

算法

java基础

  • 如何访问一个文件的字节流呢

多线程

  • 做的主要是Java对吧,讲一下多线程把,用到哪些写一下,写了thread和runnable,然后写了线程池,她问我线程池由哪些组件组成,有哪些线程池,分别怎么使用,以及拒绝策略有哪些。
  • 什么时候多线程会发生死锁,写一个例子吧,然后我写了一个两个线程,两个锁,分别持有一个,请求另一个的死锁实例
  • 集合类熟悉吧,写一个题目,一个字符串集合,找出pdd并且删除,我直接写了一个list然后for循环判断相等时删除,她说明显问题,我才发现list直接删位置会出错,于是我说改用数组,她说不太符合要求,所以应该使用iterator删除会好一点,修改会反映到集合类,并且不会出错。
  • 然后说一下Redis吧,是单线程还是多线程,Redis的分布式怎么做,说了集群。
  • RPC了解么,我说了主要是协议栈+数据格式+序列化方式,然后需要有服务注册中心管理生产者和消费者,他问我注册中心宕机怎么办,我说可以做高可用,他说要问的不是这个,是想问我注册中心宕机时消费者是否能访问生产者。
  • 线程数很多会怎么样,我说会占内存,还有就是切换线程比较频繁,他问切换线程会发生什么,应该就是CPU切换上下文,具体就是寄存器和内存地址的刷新。

JVM

消息中间件

spring全家桶

数据库

  • MySQL的主从复制怎么做的,答日志,具体原理是什么,有什么优缺点。

其他

  • Redis了解哪些内容,是单线程么,为什么是单线程呢,数据一定是存在物理内存中么,我不懂这话啥意思,就问了一下是不是指可能也在虚拟内存中。他说那讲一下虚拟内存的机制把,我就讲了分页,页表,换页这些东西。
  • 分布式了解哪些东西,消息队列了解么,用在什么场景,说了削峰,限流和异步。说了kafka,问我怎么保证数据不丢失,以及确保消息不会被重复消费。还问了消息送达确认是怎么做的。
  • cap了解么,分别指什么,base呢,强一致性和弱一致性有什么方法来做,2pc了解么,说一下大概过程。
  • 这样一个题目,一个节点要和客户连接建立心跳检测,大概有百万数量的连接,并且会定期发送心跳包,要写一个update方法和check方法,update方法更新心跳状态,check删除超时节点,怎么做,刚开始做了个hash发现check要轮询太慢了,然后用计时器和开线程检测也不行,最后说了个LRU,他说OK的。

华为

数据结构

操作系统

计算机网络

算法

java基础

多线程

JVM

消息中间件

spring全家桶

  • 请求到SSH框架的流程图画一下?远程调用Shell脚本用到哪些命令?

数据库

  • 数据量多大?项目PG(PostgreSQL)版本?非结构化数据指的是什么?有没有考虑过nosql?分库分表怎么分?查询的表会合并在一起吗?
  • 项目性能有没有考虑过?(我是做服务端的,主要考虑请求并发量)数据库性能呢?(了解一点,MySQL主从结构)

其他

  • Nginx原理了解吗?(只用到负载均衡,介绍了一下负载均衡策略

网易

数据结构

操作系统

计算机网络

算法

  • 判断树对称
  • 数组顺时针旋转90度
  • 用wait和notify模拟生产者消费者模式

java基础

  • public protected private区别?final和finally区别?final可以用在方法参数上吗?RuntimeException和非RuntimeException?各举几个例子?比方说文件读写的时候会有什么异常?怎么实现序列化?除了Java原生序列化方法,序列化还有什么格式?

  • ArrayList和LinkedList区别?

  • ArrayList和LinkedList是线程安全的吗?为什么说他们不是线程安全的,举实际场景?
  • 有什么线程安全的List?(CopyOnWriteArrayList)讲一下怎么实现线程安全的?(读时共享,写时复制,加锁机制)
  • 线程A和线程B同时针对一个共享变量进行操作,如何实现线程安全?
  • 平常怎么创建线程?线程池里闲置线程怎么保活?(不清楚,说了自己的想法)那怎么唤醒?如果用wait()和notify(),对谁加锁?FF
  • synchronized 和 ReentrantLock的区别?平常有用哪些集合类?Concurrent包有用吗?

多线程

JVM

  • JVM内存模型?如果给一个类,里面只有一个main方法,方法里面只有一句System.out.println(“helloworld”),问运行这个类会在Java内存模型里发生什么? “helloworld”存储在哪里?
  • JVM内存模型?每个区是做什么的?垃圾回收机制?

消息中间件

spring全家桶

  • Spring中Bean生命周期?提到的Aware相关接口指的是什么?平常会自己会用Aware相关接口吗?Bean生命周期这么长是为什么?

数据库

  • 给一个数据库表,ID、score两个字段分别代表学生ID和成绩,写SQL语句求ID=?的学生排第几名?
  • 假设是InnoDB,给上述SQL语句加索引怎么加?为什么这样建立?聚集索引和非聚集索引有什么区别?
  • MySQL数据库,给一个用户表格,ID、用户名、性别、用户信息…,假设经常对性别字段进行查询,问怎么建立索引?为什么?假设用户名需要是唯一的,问怎么建索引?
  • 添加索引的SQL语句?给一个abc三个字段的索引,where a=0 order by c能用到索引吗?where a=0 and b大于0 order by c能用到索引吗?Hash索引和B树索引的区别?Hash索引有区间查询吗?有没有用nosql?

其他

  • 介绍一下觉得做得最好的项目?画一下项目的框架结构图?Nginx用来做什么?采用了什么负载均衡策略?万一某一个服务器挂掉怎么办?(一致性hash)如果添加一个节点呢?
  • 平常用到哪些设计模式?介绍一下模式?模式和装饰器模式区别?
  • NIO和BIO区别?NIO怎么写?阻塞和非阻塞,同步和异步区别?

CVTE

数据结构

操作系统

计算机网络

算法

java基础

  • Java为什么说是面向对象的?
  • ava的三大特性?如果说有两个方法,同名同参数但不同返回值,问是重载吗?
  • 平常用到哪些集合类?ArrayList和LinkedList区别?HashMap内部数据结构?ConcurrentHashMap分段锁?

多线程

  • Volatile关键词?是线程安全的吗?
  • 如何实现synchronized一样的效果?

JVM

消息中间件

spring全家桶

  • Spring Cloud用到什么东西?如何实现负载均衡?服务挂了注册中心怎么判断
  • Spring的优点?Spring AOP实现原理?AOP应用场景?拦截器用来做什么业务?

数据库

  • MySQL数据库引擎和应用场景
  • MySQL行锁是否会有死锁的情况?
  • MySQL事务隔离级别
  • MySQL平常有索引优化吗?怎么去知道一个SQL语句需不需要优化?一个表,建立了索引(B,A),问where A=1 and B=2索引是否能够生效?
  • 乐观锁和悲观锁了解吗?JDK中涉及到乐观锁和悲观锁的内容

其他

  • Nginx负载均衡策略?
  • ip_hash的优缺点?
  • Nginx和其他负载均衡框架对比过吗?
  • Tomcat集群Session共享问题?
  • MySQL采用了什么存储引擎,为什么?
  • 分布式锁?
Thank you for your accept. mua!
-------------本文结束感谢您的阅读-------------