Java后端开发常考面试题大全(持续更新中)

   日期:2020-09-06     浏览:101    评论:0    
核心提示:最近开始着手准备秋招了,根据许多大佬的面经总结了一些面试题,一是为了自己复习准备面试,二是想分享出来,希望能帮到一些同学。整理如有遗漏请大家谅解。随手点赞,养成好习惯~目录计算机网络GET请求和POST请求的区别在浏览器网址输入一个url后直到浏览器显示页面的过程 (这边面试官可能会详细的考察DNS服务器的知识)TCP三次握手和四次挥手的过程 (为什么不可以两次握手,为什么握手要三次,挥手需要四次)七层OSI模型或TCP/IP协议模型 (各层分别实现了什么协议)各种IO.

最近开始着手准备秋招了,根据许多大佬的面经总结了一些面试题,一是为了自己复习准备面试,二是想分享出来,希望能帮到一些同学。整理如有遗漏请大家谅解。

其中一些题还是有点难度的,想冲击大厂的同学可以看一看。理解比死记硬背更重要,希望大家都能拿到自己想要的offer。

随手点赞,养成好习惯~

 

目录

计算机网络

GET请求和POST请求的区别

在浏览器网址输入一个url后直到浏览器显示页面的过程 (这边面试官可能会详细的考察DNS服务器的知识)

TCP三次握手和四次挥手的过程 (为什么不可以两次握手,为什么握手要三次,挥手需要四次)

七层OSI模型或TCP/IP协议模型 (各层分别实现了什么协议)

各种IO模型的知识 (BIO,NIO,AIO)

HTTP协议和TCP协议的区别

HTTP和HTTPS的区别

HTTPS的请求过程

HTTP协议的发展历程

lvs,nginx,HA在七层网络协议中分别作用于哪层,各自的区别

TCP如何实现可靠传输 (如何实现UDP的可靠传输)

TCP和UDP的区别

操作系统

线程和进程的区别 (可能会问到协程)

进程的调度算法

linux中几种io模型 (select,poll,epoll)

分页,分段,段页的区别

操作系统的作用和功能

死锁的定义、产生条件以及如何避免死锁(银行家算法)

进程的通信方式

线程的七态模型

进程间同步与互斥的区别,线程同步的方式

动态链接库与静态链接库的区别

数据结构

如何检验链表是否有环

常用的排序算法 (算法复杂度,是否稳定,空间复杂度)

二叉树和B树的区别

B树和B+树的区别

hashMap解决hash冲突的几种方式

红黑树和平衡二叉树的区别

霍夫曼编码的应用

数组和链表的区别

10w条数据如何找出前一百条频繁数据

Java基础

HashMap底层原理 (一定要看源码)

有序集合有哪些

jvm内存模型 (线程私有和线程共享内存分别是什么)

gc算法,垃圾收集器有哪些 (g1收集器非常重要)

如何控制线程并发安全

线程安全的集合有哪些( 各种集合类的比较,如HashTable和ConcurrentHashMap之间的区别和效率差异)

java中常见的锁 (乐观锁悲观锁)

synchronized和lock有什么区别

可重入锁和非可重入锁的区别

线程池的七个参数,线程池的好处

java中有哪些常用的线程池‘

jvm类加载过程

反射的原理,有什么应用

java如何打破双亲委派

volatile的作用

线程间如何通信

CAS算法以及可能产生的问题

乐观锁和悲观锁的区别

String,StringBuffer和StringBuilder的区别 (String是不可变类有什么好处)

为什么String是不可变类,有什么好处

如何保证线程顺序执行

sleep和wait的区别

synchronized锁膨胀过程

抽象类与接口的区别

HashMap和HashTable的区别

线程安全的数组有哪些

谈谈你对面向对象的理解

常用的设计模式

HashMap和HashTable的区别

MySQL数据库

数据库中有哪些索引类型

数据库索引底层实现

为什么选用B+树

hash索引与B+树如何选用

有哪些数据库引擎,各自的区别

怎么对一条查询语句进行调优

聚集索引和非聚集索引的区别

MySQL有哪几种锁,分别怎么实现

MySQL四种隔离引擎,底层实现

什么情况下设置了索引但是会失效

优化数据库的方案

数据库的三大范式

数据库的四大特性

数据库如何解决幻读 (mvcc + 间隙锁)

Spring以及分布式

Spring的启动流程

Spring Bean的注入方式

Spring IOC如何实现 (DefaultListAbleBeanFactory)

Spring Aop如何实现,有什么作用

Spring事务传播机制有哪几种

Spring Bean的初始化过程

Spring如何解决循环依赖

Spring如何实现懒加载

分布式系统如何实现数据一致性

谈谈你对微服务的理解

负载均衡策略有哪几种方式

SOA和微服务的区别

如何实现分布式锁

如何手写限流算法

CAP理论和base定理

分布式系统需要考虑哪些问题

你的系统你会从哪些方面考虑去优化

你的服务挂了怎么处理

 

  • 计算机网络

1.GET请求和POST请求的区别

答:

•   数据传输方式不同:GET请求通过URL传输数据,而POST的数据通过请求体传输。

•   安全性不同:POST的数据因为在请求主体内,所以有一定的安全性保证,而GET的数据在URL中,通过历史记录,缓存很容易查到数据信息。

•   数据类型不同:GET只允许 ASCII 字符,而POST无限制。

•   GET无害: 刷新、后退等浏览器操作GET请求是无害的,POST可能重复提交表单。

•   特性不同:GET是安全(这里的安全是指只读特性,就是使用这个方法不会引起服务器状态变化)且幂等(幂等的概念是指同一个请求方法执行多次和仅执行一次的效果完全相同),而POST是非安全非幂等

•   简单来说:GET产生一个TCP数据包,POST产生两个TCP数据包。

严格的说:对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST请求。浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

 

2.在浏览器网址输入一个url后直到浏览器显示页面的过程 (这边面试官可能会详细的考察DNS服务器的知识)

步骤:

①输入网址:输入URL。

②缓存解析:获取URL后解析,先去服务器缓存中查看是否有目标网页的缓存,如果有就从缓存中加载(缓存就是把之前访问过的js、css、图片等资源存储在系统磁盘或内存中),没有就进行下一步。

③域名解析:在发送http之前需要进行DNS解析即域名解析(域名到IP地址的转换过程。域名的解析工作由DNS服务器完成,解析后可以获取域名相应的IP地址)。

④TCP连接,三次握手:域名解析后,浏览器向服务器发送http请求,此时就要进行TCP三次握手连接。

⑤服务器收到请求:TCP连接建立成功后,服务器收到浏览器发送的请求信息(包含请求头和请求体),返回一个响应头和响应体。

⑥页面渲染:浏览器收到服务器返回的响应头和响应体,进行客户端渲染,生成Dom树,解析css样式,进行js交互等。

 

3.TCP三次握手和四次挥手的过程 (为什么不可以两次握手,为什么握手要三次,挥手需要四次)

答:

三次握手

四次挥手

【问题一】为什么使用三次握手?

答:为了防止已失效的连接请求报文段突然又传送到了服务端,使服务端一直等待,浪费资源。

 ——谢希仁著《计算机网络》第四版

谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”主要目的防止server端一直等待,浪费资源。

【问题二】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以将SYN+ACK放在同一个报文中发送(其中ACK报文是用来应答的,SYN报文是用来同步的)。但是关闭连接时,当Server端收到FIN报文时,仅仅表示对方没有数据发送过来了,而并不会立即关闭SOCKET(因为数据可能还没有发送完),所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

 

【问题三】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假想网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

【问题四】为什么不能用两次握手进行连接?

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,可能会发生死锁。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题五】如果已经建立了连接,但是客户端突然出现故障了怎么办?

答:TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

 

4.七层OSI模型或TCP/IP协议模型 (各层分别实现了什么协议)

5.各种IO模型的知识 (BIO,NIO,AIO)

文章略长,点击这里查看

 

6.HTTP协议和TCP协议的区别

TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。

①http对应于应用层。

②TCP协议对应于传输层。

③http协议是在TCP协议之上建立的,http在发起请求时通过TCP协议建立起连接服务器的通道,请求结束后,立即断开TCP连接。

说明:从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

④http是无状态的短连接,而TCP是有状态的长连接。

 

7.HTTP和HTTPS的区别

https是安全版的http,因为http协议的数据都是明文进行传输的,所以对于一些敏感信息的传输就很不安全,HTTPS就是为了解决HTTP的不安全而生的。

HTTPS = HTTP + SSL(Secure Sockets Layer 安全套接字协议)

 

8.HTTPS的请求过程

①客户端向服务器发起HTTPS的请求,连接到服务器的443端口;

②服务器将非对称加密的公钥传递给客户端,以证书的形式回传到客户端;

③服务器接收到该公钥进行验证,就是验证2中证书,如果有问题,则HTTPS请求无法继续;如果没有问题,则上述公钥是合格的。(第一次HTTP请求)客户端这个时候随机生成一个私钥,称为client key 客户端私钥,用于对称加密数据的。使用前面的公钥对client key进行非对称加密;

④进行二次HTTP请求,将加密之后的client key传递给服务器;

⑤服务器使用私钥进行解密,得到client key,使用client key对数据进行对称加密

⑥将对称加密的数据传递给客户端,客户端使用非对称解密,得到服务器发送的数据,完成第二次HTTP请求。

 

9.HTTP协议的发展历程

文章略长,点击这里查看

 

10.lvs,nginx,HA在七层网络协议中分别作用于哪层,各自的区别

LVS:是基于四层的转发,介于网络层和运输层之间

Nginx:可以做七层的转发,是web服务器,缓存服务器,反向代理服务器

HA:负载均衡器,是基于四层和七层的转发

更详细请点击

 

11.TCP如何实现可靠传输 (如何实现UDP的可靠传输)

TCP通过序列号、检验和、确认应答信号、重发控制、连接管理、窗口控制、流量控制、拥塞控制实现可靠性。

UDP通过实现确认机制、重传机制、窗口确认机制实现可靠性。

 

12.TCP和UDP的区别

 

  • 操作系统

1.线程和进程的区别 (可能会问到协程)

1)进程

进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。

(2)线程

 线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

(3)联系

 线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

(4)区别:理解它们的差别,我从资源使用的角度出发。(所谓的资源就是计算机里的中央处理器,内存,文件,网络等等)

根本区别:①进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

②在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

③所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)

④内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

⑤包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

 

2.进程的调度算法

先来先服务调度算法FCFS

先到的进程先调度,执行过程不会被中断直到进程结束。

优点:易于实现,且相当公平。

缺点:比较有利于长进程,而不利于短进程。

短作业优先调度算法SJF

优先分配给短进程执行。

优点:平均周转时间最短,进程等待时间缩短,可以增大系统吞吐量。

缺点:难以准确预估进程执行时间,开销较大;不利于长进程,有可能“饥饿”现象。

高响应比调度算法HRRN

一种关于先来先服务和短作业优先的折中算法,当一个长进程等待时间过长,就会获得较高的优先权,因此不会出现“饥饿”现象。

优先级D=(执行时间+等待时间)/执行时间

优点:不会出现“饥饿”现象,长作业也有机会被调度。

缺点:每次都需要计算优先级,系统开销大。

时间片轮转调度算法RR

为进程设定时间片,即每个进程运行的时间,在一个时间片结束时,发生时钟中断,调度程序暂停执行并加入队尾,通过上下文切换执行当前队首进程

优点:算法简单,响应时间短。

缺点:不利于处理紧急作业;时间片过小会导致频繁进程上下文切换,增大系统开销;时间片过长则会退化为FCFS。

 

3.linux中几种io模型 (select,poll,epoll)

三种模型总结

 

4.分页,分段,段页的区别

目的

页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。或者说,分页是出于系统管理的需要而不是用户需要。

段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了更好地满足用户的需要。

长度

页的大小固定而且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面。

段的长度不固定,决定于用户所编写的程序,通常由编译程序在对程序进行编译时,根据信息的性质来划分。

地址空间

页的地址空间是一维的,即单一的线形地址空间,程序员只要利用一个记忆符就可以表示一个地址。

作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需给出段内地址。

碎片

分页有内部碎片无外部碎片

分段有外部碎片无内部碎片

绝对地址

处理器使用页号和偏移量计算绝对地址

处理器使用段号和偏移量计算绝对地址

管理方式

对于分页,操作系统必须为每个进程维护一个页表,以说明每个页对应的的页框。当进程运行时,它的所有页都必须在内存中,除非使用覆盖技术或虚拟技术,另外操作系统需要维护一个空闲页框列表。

对于分段,操作系统必须为每个进程维护一个段表,以说明每个段的加载地址和长度。当进程运行时,它的所有短都必须在内存中,除非使用覆盖技术或虚拟技术,另外操作系统需要维护一个内存中的空闲的空洞列表。

特别的,当使用虚拟技术是,把一页或一段写入内存时可能需要把一页或几个段写入磁盘。

共享和动态链接

分页不容易实现,分段容易实现

 

5.操作系统的作用和功能

操作系统(daoOperating System,简称OS)是一管理电脑硬件与软件资源的程序,同时也是计算机系专统的内核与基石。操作系属统是一个庞大的管理控制程序,大致包括5个方面的管理功能:进程与处理机管理、作业管理、存储管理、设备管理、文件管理。

 

6.死锁的定义、产生条件以及如何避免死锁(银行家算法)

定义:多个进程在执行过程中,因争夺同类资源且资源分配不当而造成的一种互相等待的现象,若无外力作用,它们都将永远无法继续执行,这种状态称为死锁,这些处于等待状态的进程称为死锁进程。

 

产生条件:

互斥:一个资源每次只能被一个进程使用(资源独立)

请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁)

不剥夺:进程已获得的资源,在未使用之前,不能强行剥夺(抢夺资源)

循环等待:若干进程之间形成一种头尾相接的循环等待的资源关闭(死循环)

 

避免死锁:

①加锁顺序(线程按照一定的顺序加锁)

②加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

③死锁检测

 

银行家算法:

①操作系统按照银行家指定的规则为进程分配资源,当进程首次申请资源时,需要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请资源分配资源,否则就推迟分配;

②当进程在执行中继续申请资源时,先测试该进程本次申请的资源数,是否超过了该资源剩余的总量,若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

更详细的银行家算法

 

7.进程的通信方式

①管道:速度慢,容量有限,只有父子进程能通讯   

②FIFO:任何进程间都能通讯,但速度慢   

③消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题   

④信号量:不能传递复杂消息,只能用来同步   

⑤共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

 

8.线程的七态模型

1).线程有两种实现方式,一种是实现Runnable接口,一种是继承Thread类,但不管怎样,当我们new了这个对象后,线程就进入了初始状态;

 

2).当该对象调用了start()方法,就进入可运行状态;

 

3).进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;

 

4).进入运行状态后情况就比较复杂了

    4.1、run()方法或main()方法结束后,线程就进入终止状态;

    4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;

    4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;

   4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;

   4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

 

9.进程间同步与互斥的区别,线程同步的方式

区别:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。

也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!

总结:

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

 

方式:

①通过Object的wait和notify

②通过Condition的awiat和signal

③通过一个阻塞队列

④通过两个阻塞队列

⑤通过SynchronousQueue

⑥通过线程池的Callback回调

⑦通过同步辅助类CountDownLatch

⑧通过同步辅助类CyclicBarrier

 

10.动态链接库与静态链接库的区别

①指代不同

动态链接库:是微软公司在微软Windows操作系统中,实zhi现共享函数库概念的一种dao方式。

静态链接库:函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。

 

②特点不同

动态链接库:库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。

静态链接库:使用的.lib文件,库中的代码最后需要连接到可执行文件中去。

 

③调用方法不同

动态链接库:提供了一种使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。

静态链接库:用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。

 

  • 数据结构

1.如何检验链表是否有环

2.常用的排序算法 (算法复杂度,是否稳定,空间复杂度)

3.二叉树和B树的区别

4.B树和B+树的区别

5.hashMap解决hash冲突的几种方式

6.红黑树和平衡二叉树的区别

7.霍夫曼编码的应用

8.数组和链表的区别

9.10w条数据如何找出前一百条频繁数据

 

 

  • Java基础

1.HashMap底层原理 (一定要看源码)

2.有序集合有哪些

3.jvm内存模型 (线程私有和线程共享内存分别是什么)

4.gc算法,垃圾收集器有哪些 (g1收集器非常重要)

5.如何控制线程并发安全

6.线程安全的集合有哪些( 各种集合类的比较,如HashTable和ConcurrentHashMap之间的区别和效率差异)

7.java中常见的锁 (乐观锁悲观锁)

8.synchronized和lock有什么区别

9.可重入锁和非可重入锁的区别

10.线程池的七个参数,线程池的好处

11.java中有哪些常用的线程池‘

12.jvm类加载过程

13.反射的原理,有什么应用

14.java如何打破双亲委派

15.volatile的作用

16.线程间如何通信

17.CAS算法以及可能产生的问题

18.乐观锁和悲观锁的区别

19.String,StringBuffer和StringBuilder的区别 (String是不可变类有什么好处)

20.为什么String是不可变类,有什么好处

21.如何保证线程顺序执行

22.sleep和wait的区别

23.synchronized锁膨胀过程

24.抽象类与接口的区别

25.HashMap和HashTable的区别

26.线程安全的数组有哪些

27.谈谈你对面向对象的理解

28.常用的设计模式

29.HashMap和HashTable的区别

 

 

 

  • MySQL数据库

1.数据库中有哪些索引类型

2.数据库索引底层实现

3.为什么选用B+树

4.hash索引与B+树如何选用

5.有哪些数据库引擎,各自的区别

6.怎么对一条查询语句进行调优

7.聚集索引和非聚集索引的区别

8.MySQL有哪几种锁,分别怎么实现

9.MySQL四种隔离引擎,底层实现

10.什么情况下设置了索引但是会失效

11.优化数据库的方案

12.数据库的三大范式

13.数据库的四大特性

14.数据库如何解决幻读 (mvcc + 间隙锁)

 

 

  • Spring以及分布式

1.Spring的启动流程

2.Spring Bean的注入方式

3.Spring IOC如何实现 (DefaultListAbleBeanFactory)

4.Spring Aop如何实现,有什么作用

5.Spring事务传播机制有哪几种

6.Spring Bean的初始化过程

7.Spring如何解决循环依赖

8.Spring如何实现懒加载

9.分布式系统如何实现数据一致性

10.谈谈你对微服务的理解

11.负载均衡策略有哪几种方式

12.SOA和微服务的区别

13.如何实现分布式锁

14.如何手写限流算法

15.CAP理论和base定理

16.分布式系统需要考虑哪些问题

17.你的系统你会从哪些方面考虑去优化

18.你的服务挂了怎么处理

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服