2023年Java大厂面试必备100题_第1页
2023年Java大厂面试必备100题_第2页
2023年Java大厂面试必备100题_第3页
2023年Java大厂面试必备100题_第4页
2023年Java大厂面试必备100题_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023年JaVa大厂面试必备Ie)O题(一)

一、基础篇

1、深拷贝和浅拷贝区别是什么?

【仅供参考】

浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对

象并没有复制。

深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。

2、构造器是否可被重写?

【仅供参考】

Constructor不能被override(重写),但是可以overload(重载),所以你可以看到个

类中有多个构造函数的情况。

3、String类的常用方法都有那些?

【仅供参考】

indexθf():返回指定字符的索引。

charAt():返回指定索引处的字符。

replace():字符串替换。

trim():去除字符串两端空白。

split():分割字符串,返回一个分割后的字符串数组。

getBytes():返回字符串的byte类型数组。

IengthO:返回字符串长度。

toLowerCase():将字符串转成小写字母。

toUpperCase():将字符串转成大写字符。

substring():截取字符串。

equals():字符串比较。

4、String类可以继承吗?

【仅供参考】

不行。String类使用final修饰,无法被继承。

5、final在Java中有什么作用?

【仅供参考】

final修饰的类叫最终类,该类不能被继承。

final修饰的方法不能被重写。

final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

第1/25页

6、抽象类(abstractclass)和接口(interface)有什么区别?

【仅供参考】

抽象类只能单继承,接口可以多实现。

抽象类可以有构造方法,接口中不能有构造方法。

抽象类中可以有成员变量,接口中没有成员变量,只能有常量(默认就是publicstatic

final)

抽象类中可以包含非抽象的方法,在Java7之前接口中的所有方法都是抽象的,在Java8

之后,接口支持非抽象方法:default方法、静态方法等。JaVa9支持私有方法、私有静态方

法。

抽象类中的方法类型可以是任意修饰符,Java8之前接口中的方法只能是public类型,Java

9支持PriVate类型。

设计思想的区别:

接口是自上而下的抽象过程,接口规范了某些行为,是对某一行为的抽象。我需要这个行为,

我就去实现某个接口,但是具体这个行为怎么实现,完全由自己决定。

抽象类是自下而上的抽象过程,抽象类提供了通用实现,是对某一类事物的抽象。我们在写实

现类的时候,发现某些实现类具有几乎相同的实现,因此我们将这些相同的实现抽取出来成为

抽象类,然后如果有一些差异点,则可以提供抽象方法来支持自定义实现。

我在网上看到有个说法,挺形象的:

普通类像亲爹,他有啥都是你的。

抽象类像叔伯,有一部分会给你,还能指导你做事的方法。

接口像干爹,可以给你指引方法,但是做成啥样得你自己努力实现。

7、Java中的Math,round(-1.5)等于多少?

【仅供参考】

等于-1,因为在数轴上取值时,中间值(0.5)向右取整,所以正0.5是往上取整,负0.5

是直接舍弃。

8、了解JaVa的包装类型吗?为什么需要包装类?

【仅供参考】

Java是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如,在集合类

中,我们是无法将int、double等类型放进去的。因为集合的容器要求元素是Object类

型。

为了让基本类型也具有对象的特征,就出现了包装类型。相当于将基本类型包装起来,使得它

具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

9、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

【仅供参考】

区分两种情况,发出调用时是否显示创建了对象实例。

1)没有显示创建对象实例:不可以发起调用,非静态方法只能被对象所调用,静态方法可以

通过对象调用,也可以通过类名调用,所以静态方法被调用时,可能还没有创建任何实例对

象。因此通过静态方法内部发出对非静态方法的调用,此时可能无法知道非静态方法属于哪个

第2/25页

对象。

publicclassDemo{

publicstaticvoidStaticMethodO{

//直接调用非静态方法:编译报错

InstanceMethod();

publicvoidinstanceMethod(){

System.out.PrintI.n("非静态方法");

2)显示创建对象实例:可以发起调用,在静态方法中显示的创建对象实例,则可以正常的调

用。

publicclassDemo(

publicstaticvoidStaticMethodO{

//先创建实例对象,再调用非静态方法:成功执行

Demodemo=newDemo();

demo.instanceMethod0;

)

publicvoidinstanceMethod(){

System,out.Println("非静态方法");

10、&和&&的区别?

【仅供参考】

&&:逻辑与运算符。当运算符左右两边的表达式都为true,才返回true。同时具有短路性,

如果第一个表达式为false,则直接返回falseo

&:逻辑与运算符、按位与运算符。

按位与运算符:用于二进制的计算,只有对应的两个二进位均为1时,结果位才为1,否则为

Oo

逻辑与运算符:&在用于逻辑与时,和&&的区别是不具有短路性。所在通常使用逻辑与运算

符都会使用&&,而&更多的适用于位运算。

11、JDK/JRE/JVM三者的关系

【仅供参考】

英文名称(JavaVirtualMachine),就是我们耳熟能详的JaVa虚拟机。JaVa能够跨平台运

行的核心在于JVM。

所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说

ClaSS文件并不直接与机器的操作系统交互,而是经过虚拟机间接与操作系统交互,由虚拟机将

程序解释给本地系统执行。

第3/25页

针对不同的系统有不同的jvm实现,有LinUX版本的jvm实现,也有WindOWS版本的jvm

实现,但是同一段代码在编译后的字节码是一样的。这就是JaVa能够跨平台,实现一次编写,

多处运行的原因所在。

JRE

英文名称(JaVaRuntimeEnvironment),就是JaVa运行时环境。我们编写的JaVa程序必须要

在JRE才能运行。它主要包含两个部分,JVM和Java核心类库。

JRE是JaVa的运行环境,并不是一个开发环境,所以没有包含任何开发工具,如编译器和调试器

等。

如果你只是想运行JaVa程序,而不是开发JaVa程序的话,那么你只需要安装JRE即可。

JDK

JDK目录下有个JRE,也就是川K中已经集成了JRE,不用单独安装JRE。

另外,JDK中还有一些好用的工具,如jinfo,jps,jstack等。

JRE=JVM+Java核心类库

JDK=JRE+JaVa工具+编译器+调试器

12、两个对象的hashCode()相同,则equals()也一定为true,对吗?

【仅供参考】

不对,两个对象的hashCode()相同,equals()不一*定true0

代码示例:

Stringstrl="通话";

Stringstr2="重地

System,out.printin(String,format("strl:%d∣str2:%d”,strl.hashCode(),str2.

hashCode()));

System,out.printin(strl.equals(str2));

执行的结果:

strl:1179395∣str2:1179395

false

代码解读:很显然“通话”和“重地”的hashCode()相同,然而equals()则为false,因

为在散列表中,hashCode0相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得

出键值对相等。

13、面向对象和面向过程的区别?

【仅供参考】

面向对象和面向过程是一种软件开发思想。

面向过程就是分析出解决问题所需要的步骤,然后用函数按这些步骤实现,使用的时候依次调

用就可以了。

面向对象是把构成问题事务分解成各个对象,分别设计这些对象,然后将他们组装成有完整功

能的系统。面向过程只用函数实现,面向对象是用类实现各个功能模块。

以五子棋为例,面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、

判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就

第4/25页

解决了。

而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:

黑白双方

棋盘系统,负责绘制画面

规则系统,负责判定诸如犯规、输赢等。

黑白双方负责接受用户的输入,并告知棋盘系统棋子布局发生变化,棋盘系统接收到了棋子的

变化的信息就负责在屏幕上面显示出这种变化,同时利用规则系统来对棋局进行判定。

14、JaVa创建对象有几种方式?

【仅供参考】

JaVa创建对象有以下几种方式:

用new语句创建对象。

使用反射,使用CIaSs.newlnstance()创建对象。

调用对象的CIOne()方法。

运用反序列化手段,调用java.io.ObjeCtlnPUtStream对象的readθbject()方法。

15、JaVa的特点?

【仅供参考】

JaVa具有平台独立性和移植性。

JaVa有一句口号:Writeonce,runanywhere,一次编写、到处运行。这也是JaVa的魅力所

在。而实现这种特性的正是JaVa虚拟机JVM。己编译的JaVa程序可以在任何带有JVM的平台上运

行。你可以在WindOWS平台编写代码,然后拿到IinUX上运行。只要你在编写完代码后,将代码

编译成.class文件,再把ClaSS文件打成JaVa包,这个jar包就可以在不同的平台上运行了。

JaVa具有稳健性。

JaVa是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。JaVa要求显式的

方法声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导

致更可靠的程序。

异常处理是JaVa中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信

号。使用try/catch/finally语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢

复的任务。

16、JVM是如何处理异常的?

【仅供参考】

在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给JVM,该异常对象包含

常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给JVM的过程称为抛

异常。可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表

叫做

调用栈。

JVM会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。当

第5/25页

JVM

发现可以处理异常的代码时,会把发生的异常传递给它。如果JVM没有找到可以处理该异常的

码块,JVM就会将该异常转交给默认的异常处理器(默认处理器为JVM的一部分),默认异常

理器打印出异常信息并终止应用程序。

17、JaVa常见异常有哪些

【仅供参考】

java.lang.IllegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域

(Field)或

者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。

java.lang.InstantiationError:实例化错误。当一个应用试图通过JaVa的new操作符构造一个

抽象

类或者接口时抛出该异常.

java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让JaVa虚拟机分配给一个对

时抛出该错误。

java.lang.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈

溢出

或者陷入死循环时抛出该错误。

java.lang.ClassCastException:类造型异常。假设有类A和B(A不是B的父类或子类),0是A

实例,那么当强制将0构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。

java.lang.ClassNotFoundException:找不到类异常。当应用试图根据字符串形式的类名构造

类,

而在遍历CLASSPAH之后找不到对应名称的CIaSS文件时,抛出该异常。

java.lang.ArithmeticException:算术条件异常。譬如:整数除零等。

java.lang.ArraylndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数

大于等于数组大小时抛出。

java.lang.IndexOutOfBoundsException:索引越界异常。当访问某个序列的索引值小于0或大

等于序列大小时,抛出该异常。

java.lang.InstantiationException:实例化异常。当试图通过newlnstance()方法创建某个类

的实

例,而该类是一个抽象类或接口时,抛出该异常。

java.lang.NoSuchFieldException:属性不存在异常。当访问某个类的不存在的属性时抛出该

常。

java.lang.NoSuchMethodException:方法不存在异常。当访问某个类的不存在的方法时抛出该

第6/25页

异常。-

java.lang.NullPointerException:空指针异常。当应用试图在要求使用对象的地方使用了

null时,

抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、

使用

throw语句抛出null等等。

java.lang.NumberFormatException:数字格式异常。当试图将—IKString转换为指定的数字类

型,而该字符串确不满足数字类型要求的格式时,抛出该异常。

java.lang.StringlndexOutOfBoundsException:字符串索引越界异常。当使用索引值访问某个

符串中的字符,而该索引值小于O或大于等于序列大小时,抛出该异常。

18、Error和Exception区别是什么?

【仅供参考】

Error类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会

对这

类错误进行检测,JAVA应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程

会被终止,仅靠应用程序本身无法恢复;

Exception类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行

理,使应用程序可以继续正常运行。

19、throw和throws的区别?

【仅供参考】

throw:是真实抛出一个异常。

throws:是声明可能会抛出一个异常。

20、常见的异常类有哪些?

【仅供参考】

NullPointerException空指针异常

ClassNotFoundException指定类不存在

NuniberFormatException字符串转换为数字异常

IndexOutOfBoundsException数组下标越界异常

ClassCastException数据类型转换异常

FileNotFoUndEXCePtiOn文件未找到异常

NoSuchMethodException方法不存在异常

IOExceptionIO异常

SocketExceptionSocket异常

第7/25页

IT办

1、说一下HashMap的实现原理?

【仅供参考】

HashMap基于Hash算法实现的,我们通过PUt(key,value)存储,get(key)来获取。当传入

key时,HashMap会根据key.hashCode()计算出hash值,根据hash值将ValUe保存在

bucket里。当计算出的hash值相同时,我们称之为hash冲突,HashMap的做法是用链表和

红黑树存储相同hash值的valueo当hash冲突的个数比较少时,使用链表否则使用红黑

树。

2、Java容器都有哪些?

【仅供参考,

Java容器分为Collection和Map两大类,其下又有很多子类,如下所示:

Collection

List

ArrayList

LinkedList

Vector

Stack

Set

HashSet

LinkedHashSet

TreeSet

Map

HashMap

LinkedHashMap

TreeMap

ConcurrentllashMap

Hashtable

3、List›Set、Map之间的区别是什么?

【仅供参考】

List、Set、Map的区别主要体现在两个方面:元素是否有序、是否允许元素重复。LiSt元素有

序且允许重复。Set元素无序(AbStraCtSet和HaShSet无序,TreeSet二叉树排序,元素有

序),不允许重复。MaP元素无序(AbStraCtMaP和HaShmaP无序,TreeMaP二叉树排序,元素有

序),key值必须唯一,ValUe可以重复。

4、synchronized和ReentrantLock的区别

【仅供参考】

synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的

本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,

第8/25页

可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩

展性体现在几点上:

(1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁

(2)ReentrantLock可以获取各种锁的信息

(3)ReentrantLock可以灵活地实现多路通知

另外,二者的锁机制其实也是不一样的。ReentrantLock底层调用的是Unsafe的park方法

加锁,synchronized操作的应该是对象头中markword,这点我不能确定。

5^Semaphore有什么作用

【仅供参考】

Semaphore就是一个信号量,它的作用是限制某段代码块的并发数。Semaphore有一个构造函

数,可以传入一个int型整数n,表示某段代码最多只有n个线程可以访问,如果超出了

n,那么请等待,等到某个线程执行完毕这段代码块,下一个线程再进入。由此可以看出如果

Semaphore构造函数中传入的int型整数n=l,相当于变成了一"t^synchronized了。

6、说一下atomic的原理?

【仅供参考】

atomic主要利用CAS(CompareAndWwap)和volatile和native方法来保证原子操作,从

而避免synchronized的高开销,执行效率大为提升。

7、常用的并发工具类有哪些?

【仅供参考】

(1)CountDownLatch

(2)CyclicBarrier

(3)Semaphore

(4)Exchanger

8、说一下synchronized底层实现原理?

【仅供参考】

synchronized是由一对monitorenter/monitorexit指令实现的,monitor对象是同步的基本

实现单元。在Java6之前,monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进

行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在Java

6的时候,Java虚拟机对此进行了大刀阔斧地改进,提供了三种不同的monitor实现,也就

是常说的三种不同的锁:偏向锁(BiaSedLocking),轻量级锁和重量级锁,大大改进了其性

能。

9、JUC常用辅助类

【仅供参考】

COUntDOWnLatCh:设定一个数,当调用Cc)UntDoWn()时数量减一,当调用await()时判断计数器

是否为0,不为0就阻塞,直到计数器为0

CyclicBarrier:设定一个数,当调用await()时判断计数器是否达到目标值,未达到就阻塞,

第9/25页

直到计数器达到目标值

SemaPhore:设定一个信号量,当调用acquire()时判断是否还有信号,有就信号量减一线程继续

执行,没有就阻塞等待其他线程释放信号量,当调用release。时释放信号量,唤醒阻塞线程

10、编写多线程程序有几种实现方式?

【仅供参考】

通常来说,可以认为有三种方式:1)继承Thread类;2)实现Runnable接口;3)实现

Callable接口。

其中,Thread其实也是实现了Runable接口。Runnable和Callable的主要区别在于是否有

返回值。

11、怎么唤醒一个阻塞的线程

【仅供参考】

如果线程是因为调用了wait。、SIeeP()或者join()方法而导致的阻塞,可以中断线程,并

且通过抛出InterruptedException来唤醒它;如果线程遇到了IO阻塞,无能为力,因为IO

是操作系统实现的,Java代码并没有办法直接接触到操作系统。

12、什么是多线程的上下文切换

【仅供参考】

多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获

取CPU执行权的线程的过程。

13^FutureTask是什么

【仅供参考】

这个其实前面有提到过,FutureTask表示一个异步运算的任务。FutureTask里面可以传入一

个Callable的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经

完成、取消任务等操作。当然,由于FutureTask也是Runnable接口的实现类,所以

FUtUreTaSk也可以放入线程池中。

14、Java线程数过多会造成什么异常?

【仅供参考】

(1)线程的生命周期开销非常高

(2)消耗过多的CPU资源

如果可运行的线程数量多于可用处理器的数量,那么有线程将会被闲置。大量空闲的线程会占

用许多内存,给垃圾回收器带来压力,而且大量的线程在竞争CPU资源时还将产生其他性能的

开销。

(3)降低稳定性

JVM在可创建线程的数量上存在一个限制,这个限制值将随着平台的不同而不同,并且承受着

多个因素制约,包括JVM的启动参数、Thread构造函数中请求栈的大小,以及底层操作系统

对线程的限制等。如果破坏了这些限制,那么可能抛出OutOfMemoryError异常。

第10/25页

15、java反射的作是什么?

【仅供参考】

反射机制是在运时,对于任意个类,都能够知道这个类的所有属性和法;对于任意个对

象,都能够调它的任意个法。在java中,只要给定类的名字,就可以通过反射机制来获

得类的所有信息。这种动态获取的信息以及动态调对象的法的功能称为java语的反射机

16、反射有哪些应用场景呢?

【仅供参考】

川BC连接数据库时使用ClaSS.forName()通过反射加载数据库的驱动程序

ECliSPe、IDEA等开发工具利用反射动态解析对象的类型与结构,动态提示对象的属性和方法

Web服务器中利用反射调用了SeVIet的SerViCe方法

JDK动态代理底层依赖反射实现

17、什么是装饰器模式?

【仅供参考】

装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装

饰模式可以动态扩展一个实现类的功能。

装饰器模式的关键:装饰器中使用了被装饰的对象。

比如,创建一个对象“laowang”,给对象添加不同的装饰,穿上夹克、戴上帽子.这个

执行过程就是装饰者模式,实现代码如下。

18、说一下JVM调优的工具?

【仅供参考】

JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是Jconsole和

jvisualvm这两款视图监控工具。

jconsole:用于对JVM中的内存、线程和类等进行监控;

jvisualvm:JDK自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存

的变化、gc变化等。

19、说一下JVM的主要组成部分?及其作用?

【仅供参考】

类加载器(ClaSSLoader)

运行时数据区(RuntimeDataArea)

执行引擎(ExecutionEngine)

本地库接口(NativeInterface)

「组件的作用:」首先通过类加载器(CIaSSLoader)会把Java代码转换成字节码,运行时

数据区(RuntimeDataArea)再把字节码加载到内存中,而字节码文件只是JVM的一套指令

集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎

第11/25页

(ExecutionEngine),将字节码翻译成底层系统指令,再交由CPU去执行,而这个过程中需

要调用其他语言的本地库接口(NativeInterface)来实现整个程序的功能。

20、怎么判断对象是否可以被回收?

【仅供参考】

一般有两种方法来判断:

引用计数器:为每个对象创建一个引用计数,有对象引用时计数器+1,引用被释放时计数-

1,当计数器为0时就可以被回收。它有一个缺点不能解决循环引用的问题;

可达性分析:从GCRoots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC

Roots没有任何引用链相连时,则证明此对象是可以被回收的。

三、Web篇

1、常用HTTP状态码是怎么分类的?

【仅供参考】

状态码类别描述

Ixx信息状态码信息,服务器收到请求,需要请求者继续执行操作

2xx成功状态码成功,操作被成功接收并处理

3xx重定向状态码重定向,需要进一步的操作以完成请求

4xx客户端错误状态码客户端错误,请求包含语法错误或无法完成请求

5xx服务器错误状态码服务器错误,服务器在处理请求的过程中发生了错误

HTTPl.0和HTTPLI和HTTP2.0的区别

HTTPl.0:无状态,无连接

HTTPl.1:长连接,请求管道化,增加缓存处理,增加HoSt字段,支持断点传输

HTTP2.0:二进制分帧,多路复用(连接共享),头部压缩,服务器推送

2、http和https的基本概念

【仅供参考】

-HTTP:

是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准

(TCP),用于计算机之间传输文字,图片,音频,视频等超文本数据的协议,它可以使浏览器

更加高效,使网络传输减少

-HTTPS:

是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础

是SSL,HTTPS就是从HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护

-HTTPS协议的主要作用:

建立一个信息安全通道,来保证数据传输的安全

确认网站的真实性

第12/25页

3、什么是TOken

【仅供参考】

TOken的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和

密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应

运而生。

TOken的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次

登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来

请求数据即可,无需再次带上用户名和密码。

使用TOken的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器

更加健壮。

4、说一下tcp粘包是怎么产生的?

【仅供参考】

tcp粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因:

发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;

接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。

5、spring中的bean是线程安全的吗?

【仅供参考】

spring中的bean默认是单例模式,spring框架并没有对单例bean进行多线程的封装处

理。

实际上大部分时候springbean无状态的(比如dao类),所有某种程度上来说bean也是

安全的,但如果bean有状态的话(比如viewmodel对象),那就要开发者自己去保证线程

安全了,最简单的就是改变bean的作用域,把"singleton"变更为"prototype”,这样请

求bean相当于newBeano了,所以就可以保证线程安全了。

有状态就是有数据存储功能。

无状态就是不会保存数据。

6、@ReqUeStMaPPing的作用是什么?

【仅供参考】

将http请求映射到相应的类/方法上。

7、前端控制器DiSPatCherSerVlet作用?

【仅供参考】

接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之

间的耦合度。

用户请求到达前端控制器,它就相当于Oivc模式中的c,diSpatcherServlet是整个流程控制的中

心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

8、JPA和Ilibernate有哪些区别?

第13/25页

简而言之

JPA是一个规范或者接口

Hibernate是JPA的一个实现

当我们使用JPA的时候,我们使用javax.persistence包中的注释和接口时,不需要使用

hibernate的导入包。

我们建议使用JPA注释,因为哦我们没有将其绑定到Hibernate作为实现。后来(我知道-

小于百分之一的几率),我们可以使用另一种JPA实现。

9、springboot配置文件有哪几种类型?它们有什么区别?

【仅供参考】

配置文件有∙properties格式和∙yml格式,它们主要的区别是书法风格不同。

.properties配置如下:

spring.RabbitMQ.port=5672

.yml配置如下:

spring:

RabbitMQ:

port:5672

yml格式不支持©PropertySource注解导入。

10、什么是SpringDataREST?

【仅供参考】

SpringDataTEST可以用来发布关于SPring数据库的HATEOASRESTful资源。

11、什么是YAML?

【仅供参考】

YAML是一种人类可读的数据序列化语言。它通常用于配置文件。

与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且

更少混淆。可以看出YAML具有分层配置数据。

12、SPringbOOt读取配置文件的方式

【仅供参考】

SPringboot默认读取配置文件为application.PrOPertieS或者是application,yml

13、你如何理解SpringBoot中的Starters?

【仅供参考】

StarterS可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集

成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用SpringJPA访问数

据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。

第14/25页

14、在hibernate中使用Integer和int做映射有什么区别?

【仅供参考】

Integer类型为对象,它的值允许为null,而int属于基础数据类型,值不能为null0

15、说一下MyBatis的一级缓存和二级缓存?

【仅供参考】

一级缓存:基于PerpetualCache的HashMap本地缓存,它的声明周期是和SQLSession一致

的,有多个SQLSession或者分布式的环境中数据库操作,可能会出现脏数据。当Session

flush或close之后,该Session中的所有Cache就将清空,默认一级缓存是开启的。

二级缓存:也是基于PerpetualCache的IlashMap本地缓存,不同在于其存储作用域为

Mapper级别的,如果多个SQLSeSSiOn之间需要共享缓存,则需要使用到二级缓存,并且二级缓

存可自定义存储源,如Ehcacheo默认不打开二级缓存,要开启二级缓存,使用二级缓存属性

类需要实现Serializable序列化接口(可用来保存对象的状态)。

开启二级缓存数据查询流程:二级缓存->一级缓存->数据库。

缓存更新机制:当某一个作用域(一级缓存SeSSiOn/二级缓存MaPPer)进行了C∕U∕D操作后,

默认该作用域下所有select中的缓存将被Clearo

16、为什么要使用hibernate?

【仅供参考】

hibernate是对jdbc的封装,大大简化了数据访问层的繁琐的重复性代码。

hibernate是一个优秀的ORM实现,很多程度上简化了DAO层的编码功能。

可以很方便的进行数据库的移植工作。

提供了缓存机制,是程序执行更改的高效。

17、MyBatis逻辑分页和物理分页的区别是什么?

【仅供参考】

逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大

量的内存、有内存溢出的风险、对数据库压力较大。

物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比

如需要大量的内存,对数据库查询压力较大等问题。

18、MyBatiS是否支持延迟加载?延迟加载的原理是什么?

【仅供参考】

MyBatis支持延迟加载,设置IaZyLe)adingEnabled=true即可。

延迟加载的原理的是调用的时候触发加载,而不是在初始化的时候就加载信息。比如调用a.

getB().getName(),这个时候发现a.getB()的值为null,此时会单独触发事先保存好的关

联B对象的SQL,先查询出来B,然后再调用a.setB(b),而这时候再调用a.getB().

getName()就有值了,这就是延迟加载的基本原理。

19、RowBounds是一次性查询全部结果吗?为什么?

第15/25页

RowBounds表面是在“所有”数据中检索数据,其实并非是一次性查询出所有数据,因为

MyBatis是对jdbc的封装,在Jdbc驱动中有一个FetchSize的配置,它规定了每次最多

从数据库查询多少条数据,假如你要查询更多数据,它会在你执行next()的时候,去查询更多

的数据。就好比你去自动取款机取IOooO元,但取款机每次最多能取2500元,所以你要取4

次才能把钱取完。只是对于Jdbc来说,当你调用next。的时候会自动帮你完成查询工作。这

样做的好处可以有效的防止内存溢出。

20、hibernate实体类必须要有无参构造函数吗?为什么?

【仅供参考】

hibernate中每个实体类必须提供一个无参构造函数,因为hibernate框架要使用

reflectionapi,通过调用ClassnewInstance()来创建实体类的实例,如果没有无参的构造

函数就会抛出异常。

四、数据处理篇

1、RabbitMQ有哪些重要的组件?

【仅供参考】

ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使

用。

Channel(信道):消息推送使用的通道。

Exchange(交换器):用于接受、分配消息。

Queue(队列):用于存储生产者的消息。

RoutingKey(路由键):用于把生成者的数据分配到交换器上。

BindingKey(绑定键):用于把交换器的消息绑定到队列上。

2.RabbitMQ怎么保证消息的稳定性?

【仅供参考】

提供了事务的功能。

通过将channel设置为confirm(确认)模式。

3、RabbitMQ节点的类型有哪些?

【仅供参考】

磁盘节点:消息会存储到磁盘。

内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类型。

4、kafka如何减少数据丢失?

【仅供参考】

一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数据不丢失,在面试中也会

问到相关的问题。但凡遇到这种问题,是指3个方面的数据不丢失,即:producerconsumer端

第16/25页

数据不丢失broker端数据不丢失

5、集群中为什么要有主节点?

【仅供参考】

在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这

个结果,这样可以大大减少重复计算,提高性能,所以就需要主节点。

6、为什么要使用kafka,为什么要使用消息队列?

【仅供参考】

缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗

余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己

的节奏进行慢慢处理。

解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦

重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。

冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供

多个毫无关联的业务使用。

健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正

常进行。

异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许

用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需

要的时候再去处理它们。

7、kafkafollower如何与Ieader同步数据?

【仅供参考】

Kafka的复制机制既不是完全的同步复制,也不是单纯的异步复制。完全同步复制要求AIl

AliveFolIoWer都复制完,这条消息才会被认为COnImit,这种复制方式极大的影响了吞吐率。

而异步复制方式下,FOnoWer异步的从Leader复制数据,数据只要被Leader写入Iog就被认为已

经COmmi3这种情况下,如果Ieader挂掉,会丢失数据,kafka使用ISR的方式很好的均衡了确

保数据不丢失以及吞吐率。FOIlOWer可以批量的从Leader复制数据,而且Leader充分利用磁盘

顺序读以及Sendfile(zeroCOPy)机制,这样极大的提高复制性能,内部批量写磁盘,大幅减

少了FoIlOWer与Leader的消息量差。

8、kafka同时设置了7天和IOG清除数据,到第五天的时候消息达到了10G,这个时候

kafka将如何处理?

【仅供参考】

这个时候kafka会执行数据清除工作,时间和大小不论那个满足条件,都会清空数据。

9、kafka可以脱离zookeeper单独使用吗?为什么?

【仅供参考】

kafka不能脱离zookeeper单独使用,因为kafka使用zookeeper管理和协调kafka的节

点服务器。

第17/25页

10、kafka如何不消费重复数据?比如扣款,我们不能重复的扣?

【仅供参考】

其实还是得结合业务来思考,我这里给几个思路:

比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update一

下好吧。

比如你是写Redis,那没问题了,反正每次都是set,天然幕等性。

比如你不是上面两个场景,那做的稍微复杂一点,你需要让生产者发送每条数据的时候,里面

加一个全局唯一的id,类似订单id之类的东西,然后你这里消费到了之后,先根据这个id去比

如RediS里查一下,之前消费过吗?如果没有消费过,你就处理,然后这个id写Redis。如果消

费过了,那你就别处理了,保证别重复处理相同的消息即可。

比如基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了,重复数据

插入只会报错,不会导致数据库中出现脏数据。

11、Redis如何做内存优化?

【仅供参考】

尽量使用Redis的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,

这样可以有效的减少内存使用。比如将Web系统的用户对象,应该放到散列表里面再整体存储

到Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置key进行存储。

12、Redis是什么?都有哪些使用场景?

【仅供参考】

Redis是一个使用C语言开发的高速缓存数据库。

Redis使用场景:

记录帖子点赞数、点击数、评论数;

缓存近期热帖;

缓存文章详情信息;

记录用户会话信息。

13、RediS淘汰策略有哪些?

【仅供参考】

volatile-lru:从已设置过期时间的数据集(server,db[i].expires)中挑选最近最少使用

的数据淘汰。

volatile-ttl:从已设置过期时间的数据集(server,db[i].expires)中挑选将要过期的数

据淘汰。

volatile-random:从已设置过期时间的数据集(server,db[i].expires)中任意选择数据淘

汰。

allkeys-lru:从数据集(server,db[i].diet)中挑选最近最少使用的数据淘汰。

allkeys-random:从数据集(server,db[i].diet)中任意选择数据淘汰。

no-enviction(驱逐):禁止驱逐数据。

第18/25页

14、RediS支持的数据类型有哪些?

【仅供参考】

Redis支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、

ZSet(有序集合)。

15、Redis为什么是单线程的?

【仅供参考】

因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程

容易实现,而且cpu又不会成为瓶颈,那就顺理成章地采用单线程的方案了。

关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

而且单线程并不代表就慢nginx和nodejs也都是高性能单线程的代表。

16、Redis有哪些功能?

【仅供参考】

数据缓存功能

分布式锁的功能

支持数据持久化

支持事务

支持消息队列

17、什么是缓存穿透?怎么解决?

【仅供参考】

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数

据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故

障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

18、Redis持久化有几种方式?

【仅供参考】

Redis的持久化有两种方式,或者说有两种策略:

RDB(RedisDatabase):指定的时间间隔能对你的数据进行快照存储。

AOF(AppendOnlyFile):每一个收到的写命令都通过Write函数追加到文件中。

19、Redis常见的性能问题有哪些?该如何解决?

【仅供参考】

主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断

性暂停服务,所以主服务器最好不要写内存快照。

Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域

网内。

第19/25页

20、怎么保证缓存和数据库数据的一致性?

【仅供参考】

合理设置缓存的过期时间。

新增、更改、删除数据库操作时同步更新Redis,可以使用事物机制来保证数据的一致性。

五、MySQL数据库篇

1、char和Varehar的区别是什么?

【仅供参考】

Γchar(n)J:固定长度类型,比如订阅Char(10),当你输入"abc''三个字符的时候,它们占

的空间还是10个字节,其他7个是空字节。

chat优点:效率高;缺点:占用空间;适用场景:存储密码的md5值,固定长度的,使用

char非常合适。

Γvarchar(n)J:可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节

的长度。

所以,从空间上考虑VarCahr比较合适;从效率上考虑char比较合适,二者使用需要权衡。

2、InnoDB数据页结构?

【仅供参考】

一个数据页大致划分七个部分

FileHeader:表示页的一些通用信息,占固定的38字节。

pageHeader:表示数据页专有信息,占固定的56字节。

inimum+Supermum:两个虚拟的伪记录,分别表示页中的最小记录和最大记录,占固定的26字

节。

UserRecords:真正存储我们插入的数据,大小不固定。

FreeSpace:页中尚未使用的部分,大小不固定。

PageDirectory:页中某些记录的相对位置,也就是各个槽对应的记录在页面中的地址偏移

量。

FileTrailer:用于检验页是否完整,占固定大小8字节。

数据相关

3、MySQL的并行策略有哪些?

【仅供参考】

按表分发策略:如果两个事务更新不同的表,它们就可以并行。因为数据是存储在表里的,所

以按表分发,可以保证两个worker不会更新同一行。缺点:如果碰到热点表,比如所有的更

新事务都会涉及到某一个表的时候,所有事务都会被分配到同一个worker中,就变成单线程

复制了。

按行分发策略:如果两个事务没有更新相同的行,它们在备库上可以并行。如果两个事务没有

更新相同的行,它们在备库上可以并行执行。显然,这个模式要求binlog格式必须是rowo

第20/25页

缺点:相比于按表并行分发策略,按行并行策略在决定线程分发的时候,需要消耗更多的计算

资源。

4、join用法?

【仅供参考】

使用leftjoin左边的表不一定是驱动表

如果需要leftjoin的语义,就不能把被驱动表的字段放在where条件里面做等值判断或不

等值判断,必须都写在on里面

标准的groupby语句,是需要在select部分加一个聚合函数,比如SeIeCta,count(*)

fromtgroupbyaorderbynull;

5、如何做MySQL的性能优化?

【仅供参考】

为搜索字段创建索引。

避免使用select*,列出需要查询的字段。

垂直分割分表。

选择正确的存储引擎。

6、详细说一下一条MySQL语句执行的步骤

【仅供参考】

Server层按顺序执行SQL的步骤为:

客户端请求->连接器(验证用户身份,给予权限)

查询缓存(存在缓存则直接返回,不存在则执行后续操作)

分析器(对SQL进行词法分析和语法分析操作)

优化器(主要对执行的SQL优化选择最优的执行方案方法)

执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)->去引擎层获

取数据返回(如果开启查询缓存则会缓存查询结果)

索引相关

7、关系型和非关系型数据库的区别?

【仅供参考】

关系型数据库的优点

容易理解,因为它采用了关系模型来组织数据。

可以保持数据的一致性。

数据更新的开销比较小。

支持复杂查询(带where子句的查询)

非关系型数据库(NOSQL)的优点

无需经过SQL层的解析,读写效率高。

基于键值对,读写性能很高,易于扩展

可以支持多种类型数据的存储,如图片,文档等等。

扩展(可分为内存性数据库以及文档型数据库,比如Redis,MongoDB,HBase等,适合场景:

第21/25页

数据量大高可用的日志系统/地理位置存储系统)。

8、说一下数据库的事务隔离?

【仅供参考】

MySQL的事务隔离是在MySQL,ini配置文件里添加的,在文件的最后添加:

*transaction-isolation=REPEATABLE-READ

99

可用的配置值:READ-UNCOMMITTED、READ-COMMnTED、REPEATABLE-READ、SERlALIZABLE0

READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现

幻读、脏读、不可重复读)。

READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复

读)。

REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候

的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。

SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、

幻读。

「脏读」:表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记

录A,此时该事务还未提交,然后另一个事务尝试读取到了记录Ao

「不可重复读」:是指在一个事务内,多次读同一数据。

「幻读」:指同一个事务内多次查询返回的结果集不一样。比如同一个事务A第一次查询时

候有n条记录,但是第二次同等条件下查询却有n+1条记录,这就好像产生了幻觉。发生幻

读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记

录的数据内容被修改了,所有数据行的记录就变多或者变少了。

9、binlog的概念是什么,起到什么作用,可以保证crash-safe吗?

【仅供参考】

binlog是归档日志,属于MySQLServer层的日志。可以实现主从复制和数据恢复两个作用。

当需要恢复数据时,可以取出某个时间范围内的binlog进行重放恢复。

但是binlog不可以做crashsafe,因为crash之前,binlog可能没有写入完全MySQL就

挂了。所以需要配合redolog才可以进行crashsafeo

10、MySQL有哪些自增ID?各自场景是什么?

【仅供参考】

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论