2023年Java经典面试题100题_第1页
2023年Java经典面试题100题_第2页
2023年Java经典面试题100题_第3页
2023年Java经典面试题100题_第4页
2023年Java经典面试题100题_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

2023年JaVa经典面试题IOO题(一)

一、基础篇

1、FiIeS的常用方法都有哪些?

【仅供参考】

Files,exists():检测文件路径是否存在。

Files.CreateFile():创建文件。

Files.CreateDirectory():创建文件夹。

Files,delete():删除一个文件或目录。

Files,copy():复制文件。

Files,move():移动文件。

Files.size():查看文件个数。

Files,read():读取文件。

Files,write():写入文件。

2、如何实现对象克隆?

【仅供参考】

实现CloneabIe接口,重写clone()方法。这种方式是浅拷贝,即如果类中属性有自定义引用

类型,只拷贝引用,不拷贝引用指向的对象。如果对象的属性的CIaSS也实现Cloneable接

口,那么在克隆对象时也会克隆属性,即深拷贝。

结合序列化,深拷贝。

通过Org.apache.COnImOnS中的工具类BeanUtiIS和ProPertyUtiIS进行对象复制。

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

【仅供参考】

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

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

型。

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

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

4、为什么不能根据返回类型来区分重载?

【仅供参考】

如果我们有两个方法如下,当我们调用:test(l)时,编译器无法确认要调用的是哪个。

//方法1

inttest(inta);

//方法2

longtest(inta);

第1/23页

方法的返回值只是作为方法运行之后的一个“状态”,但是并不是所有调用都关注返回值,所

以不能将返回值作为重载的唯一区分条件。

5、接口和抽象类有什么区别?

【仅供参考】

实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口。

构造函数:抽象类可以有构造函数;接口不能有。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任意访问修饰符。

6、String属于基础的数据类型吗?

【仅供参考】

String不属于基础类型,基础类型有8种:byte、boolean、char>short>int>float、

longʌdouble,而String属于对象。

7、如何将字符串反转?

H像供参膏雪

使用StringBuilder或者StringBuffer的reverse()方法。

示例代码:

//StringBufferreverse

StringBufferStringBuffer=newStringBuffer();

StringBuffer.append("abcdefg");

System,out.printin(stringBuffer.reverse());//gfedcba

//StringBuilderreverse

StringBuilderStringBuilder=newStringBuilderO;

StringBuilder.append("abcdefg");

System,out.printin(stringBuiIder,reverse());//gfedcba

8、阐述final、finally、finalize的区别。

【仅供参考】

其实是三个完全不相关的东西,只是长的有点像。。

final如上所示。

finally:finally是对JaVa异常处理机制的最佳补充,通常配合try、catch使用,用于存

放那些无论是否出现异常都一定会执行的代码。在实际使用中,通常用于释放锁、数据库连接

等资源,把资源释放方法放到finalIy中,可以大大降低程序出错的几率。

finalize:Object中的方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

finalize。方法仅作为了解即可,在Java9中该方法已经被标记为废弃,并添加新的

java.lang.ref.Cleaner,提供了更灵活和有效的方法来释放资源。这也侧面说明了,这个方法

的设计是失败的,因此更加不能去使用它。

9、什么是StringJoiner?

第2/23页

【仅供参考】

StringJe)iner是Java8新增的—fvAPI,它基于StringBuilder实现,用于实现对字符串之

间通过分隔符拼接的场景。

StringJoiner有两个构造方法,第一个构造要求依次传入分隔符、前缀和后缀。第二个构造则

只要求传入分隔符即可(前缀和后缀默认为空字符串)。

10、Java中的final关键字有哪些用法?

【仅供参考】

修饰类:该类不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为

abstract和finalo

修饰方法:该方法不能被子类重写。

修饰变量:该变量必须在声明时给定初值,而在以后只能读取,不可修改。如果变量是对象,

则指的是引用不可修改,但是对象的属性还是可以修改的。

11、transient关键字的作用?

【仅供参考】

JaVa语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值

不需要维持。

也就是说被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后,

transient变量的值被设为初始值,如int型的是0,对象型的是nullo

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

【仅供参考】

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

是直接舍弃。

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

【仅供参考】

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

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

14、普通类和抽象类有哪些区别?

【仅供参考】

普通类不能包含抽象方法,抽象类可以包含抽象方法。

抽象类不能直接实例化,普通类可以直接实例化。

15、String,StringBuffer和StringBUilder区别

【仅供参考】

可变性

String不可变

StringBuffer和StringBuilder可变

第3/23页

线程安全

String不可变,因此是线程安全的

StringBuilder不是线程安全的

StringBuffer是线程安全的,内部使用synchronized进行同步

16、NociassDefFoundError和ClassNotFoundException区别?

【仅供参考】

NociassDefFoundError是一个Error类型的异常,是由JVM引起的,不应该尝试捕获这个异

常。

引起该异常的原因是JVM或ClassLoader尝试加载某类时在内存中找不到该类的定义,该动

作发

生在运行期间,即编译时该类存在,但是在运行时却找不到了,可能是变异后被删除了等原因

导致;

ClassNotFoundException是一个受查异常,需要显式地使用try-catch对其进行捕获和处

理,或

在方法签名中用throws关键字进行声明。当使用Class.forName,ClassLoader.IoadClass

ClassLoader.findSystemClass动态加载类到内存的时候,通过传入的类路径参数没有找到该

类,

就会抛出该异常;另一种抛出该异常的可能原因是某个类已经由一个类加载器加载至内存中,

另一

个加载器又尝试去加载它。

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

【仅供参考】

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

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

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

叫做

调用栈。

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

JVM

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

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

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

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

第4/23页

【仅供参考】

NullPointerException空指针异常

ClassNotFoundException指定类不存在

NumberFormatException字符串转换为数字异常

IndexOutOfBoundsException数组下标越界异常

ClassCastException数据类型转换异常

FileNotFoundException文件未找到异常

NosuchMethodException方法不存在异常

IOExceptionIO异常

SocketExceptionSocket异常

19、try-catch-finalIy中,如果CatCh中return了,finally还会执行吗?

【仅供参考】

finally一定会执行,即使是CatCh中return了,catch中的return会等finalIy中的

代码执行完之后,才会执行。

20>final›finally>finalize有什么区别?

【仅供参考】

final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重

写、

修饰变量表示该变量是一个常量不能被重新赋值。

finalIy一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方

finalIy代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的

代码。

finalize是一个方法,属于ObjeCt类的一个方法,而Objeet类是所有类的父类,JaVa中允许使

finalize。方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

二、高级篇

1、那在什么时候用链表?什么时候用红黑树?

【仅供参考】

对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后超过8个(阈值

8):如果此时数组长度大于等于64,则会触发链表节点转红黑树节点(treeifyBin);而如

果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容,因为此时的数据量还比较

小。

对于移除,当同一个索引位置的节点在移除后达到6个,并且该索引位置的节点为红黑树节

点,会触发红黑树节点转链表节点(Untreeify)。

第5/23页

2、ArrayList和Vector的区别。

【仅供参考】

Vector和ArrayList几乎一致,唯一的区别是Vector在方法上使用了synchronized来保

证线程安全,因此在性能上ArrayList具有更好的表现。

有类似关系的还有:StringBuilder和StringBuffer>HashMap和Hashtableo

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

【仅供参考】

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

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

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

4、守护线程是什么?

【仅供参考】

守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待

处理某些发生的事件。在Java中垃圾回收线程就是特殊的守护线程。

5、多线程同步有哪几种方法?

【仅供参考】

Synchronized关键字,Lock锁实现,分布式锁等。

6、什么是自旋

【仅供参考】

很多synchronized里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程

都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题。既然

synchronized里面的代码执行得非常快,不妨让等待锁的线程不要被阻塞,而是在

synchronized的边界做忙循环,这就是自旋。如果做了多次忙循环发现还没有获得锁,再阻

塞,这样可能是一种更好的策略。

7、在Java程序中怎么保证多线程的运行安全?

【仅供参考】

方法一:使用安全类,比如Java.util,concurrent下的类。

方法二:使用自动锁Synchronizedo

方法三:使用手动锁Lock0

手动锁Java示例代码如下:

Locklock=newReentrantLock();

lock,lock();

try{

System,out.Println("获得锁");

}catch(Exceptione){

第6/23页

//TODO:handleexception

}finally{

System.out.PrintIn("释放锁”);

lock,unlock();

}

8、并行和并发有什么区别?

【仅供参考】

并行:多个处理器或多核处理器同时处理多个任务。

并发:多个任务在同一个CPU核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务

是同时执行。

并发=两个队列和一台咖啡机。

并行=两个队列和两台咖啡机。

9、Java中用到的线程调度算法是什么

【仅供参考】

抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个

总的优先级并分配下一个时间片给某个线程执行。

10、什么是Future?

【仅供参考】

在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承

thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback

接口,并用Future可以来接收多线程的执行结果。

Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在

任务执行成功或失败后作出相应的操作。

11、单例模式的线程安全性

【仅供参考】

老生常谈的问题了,首先要说的是单例模式的线程安全意味着:某个类的实例在多线程环境下

只会被创建一次出来。单例模式有很多种的写法,我总结一下:

(1)饿汉式单例模式的写法:线程安全

(2)懒汉式单例模式的写法:非线程安全

(3)双检锁单例模式的写法:线程安全

12、CyclicBarrier和CountDownLatch的区别

【仅供参考】

(1)CountDownLatch简单的说就是一个线程等待,直到他所等待的其他线程都执行完成并且

调用CoUntDoWn()方法发出通知后,当前线程才可以继续执行。

(2)CyclicBarrier是所有线程都进行等待,直到所有线程都准备好进入await()方法之

后,所有线程同时开始执行!

第7/23页

(3)CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用

reset()方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错

误,可以重置计数器,并让线程们重新执行一次。

(4)CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得

CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。如果被中断

返回true,否则返回falseo

13、创建线程的三种方式的对比?

【仅供参考】

(1)采用实现Runnable、Callable接口的方式创建多线程。优势是:

线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。在这种方式下,多

个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,

从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

劣势是:编程稍微复杂,如果要访问当前线程,则必须使用Thread∙CurrentThreadO方法。

(2)使用继承Thread类的方式创建多线程优势是:

编写简单,如果需要访问当前线程,则无需使用Thread.CurrentThreadO方法,直接使用

this

即可获得当前线程。劣势是:

线程类已经继承了Thread类,所以不能再继承其他父类。

(3)Runnable和Callable的区别

1、Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()ŋ

2、Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

3、Call方法可以抛出异常,run方法不可以。

4、运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查

计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任

务执行情况,可取消任务的执行,还可获取执行结果。

14、什么是反射?

【仅供参考】

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个

对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的

功能称为Java语言的反射机制。

15、JAVA两种方式的动态代理?

【仅供参考】

JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用

InVOkeHandIer来处理。

CGLlB动态代理:利用ASM(开源的JaVa字节码编辑库,操作字节码)开源包,将代理对象类的

ClaSS文件加载进来,通过修改其字节码生成子类来处理。

区别:JDK代理只能对实现接口的类生成代理;CGIib是针对类实现代理,对指定的类生成一个

子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。

第8/23页

16、动态代理是什么?有哪些应用?

【仅供参考】

动态代理是运行时动态生成代理类。

动态代理的应用有springaop、hibernate数据查询、测试框架的后端mock、rpc,JaVa注解

对象获取等。

17、举例说明什么情况下会更倾向于使用抽象类而不是接口?

【仅供参考】

接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以

适应不断变化的需求。下面有几个点可以帮助你回答这个问题:在Java中,你只能继承一个

类,但可以实现多个接口。所以一旦你继承了一个类,你就失去了继承其他类的机会了。

接口通常被用来表示附属描述或行为如:Runnable›Clonable、Serializable等等,因此当你

使用抽象类来表示行为时,你的类就不能同时是Runnable和ClOnabIe(注:这里的意思是指

如果把Runnable等实现为抽象类的情况),因为在Java中你不能继承两个类,但当你使用接

口时,你的类就可以同时拥有多个不同的行为。

在一些对时间要求比较高的应用中,倾向于使用抽象类,它会比接

口稍快一点。如果希望把一系列行为都规范在类继承层次内,并且可以更好地在同一个地方进

行编码,那么抽象类是一个更好的选择。有时,接口和抽象类可以一起使用,接口中定义函

数,而在抽象类中定义默认的实现。

18、什么是装饰器模式?

【仅供参考】

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

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

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

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

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

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

19、说一下类装载的执行过程?

【仅供参考】

类装载分为以下5个步骤:

加载:根据查找路径找到相应的class文件然后导入;

检查:检查加载的class文件的正确性;

准备:给类中的静态变量分配内存空间;

解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而

在直接引用直接指向内存中的地址;

初始化:对静态变量和静态代码块执行初始化工作。

20、常用的JVM调优的参数都有哪些?

LL枚俄叁老L

第9/23页

-Xms2g:初始化推大小为2g;

-XmX2g:堆最大内存为2g;

-XX:NewRati0=4:设置年轻的和老年代的内存比例为1:4;

-XX:SurvivorRatio=8:设置新生代Eden和Survivor比例为8:2;

-XX:+UseParNewGC:指定使用ParNew+SerialOld垃圾回收器组合;

-XX:+UseParaIlelOldGC:指定使用ParNew+ParNewOld垃圾回收器组合;

-XX:+UseConcMarkSweepGC:指定使用CMS+SerialOld垃圾回收器组合;

-XX:+PrintGC:开启打印gc信息;

-XX!+PrintGCDetai1s:打印gc详细信息。

三、Web篇

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

【仅供参考】

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

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

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

2、如何实现跨域?

【仅供参考】

实现跨域有以下几种方案:

服务器端运行跨域设置CORS等于*;

在单个接口使用注解@CrossOrigin运行跨域;

使用jsonp跨域;

3、http和https的区别?

【仅供参考】

区别HTTPIITTPS

协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份身披SSL(

SecureSocketLayer)外壳的HTTP,运行于SSL上,SSL运行于TCP之上,是添加了加密

和认证机制的HTTPo

端口80443

资源消耗较少由于加解密处理,会消耗更多的CPU和内存资源

证书无需证书需要证书,而证书一般需要向认证机构购买

加密机制无共享密钥加密和公开密钥加密并用的混合加密机制安全性弱由于加密机制,安全

性强

安全性弱由于加密机制,安全性强

4、TCP和UDP的区别

第10/23页

∣EM於笏百;

1、TCP:面向连接,UDP:面向无连接

2、TCP:传输效率低,UDP:传输效率高(有大小限制,一次限定在6妹b之内)

3、TCP:可靠,UDP:不可靠

5、说一下JSP的4种作用域?

【仅供参考】

page:代表与一个页面相关的对象和属性。

request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及

多个Web组件;需要在页面显示的临时数据可以置于此作用域。

session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据

应该放在用户自己的session中。

application:代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程

序,包括多个页面、请求和会话的一个全局作用域。

6、如何避免SQL注入?

【仅供参考】

使用预处理PreparedStatement0

使用正则表达式过滤掉字符中的特殊字符。

7、http和https的基本概念

【仅供参考】

-HTTP:

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

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

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

-HTTPS:

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

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

-HTTPS协议的主要作用:

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

确认网站的真实性

8、处理器映射器HandIerMaPPing作用?

【仅供参考】

根据请求的Url查找HandIer

HandIerMaPPing负责根据用户请求找到Ilandler即处理器,SPringmVC提供了不同的映射器实现

不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

9、什么是SPringBoOt自动配置?

第11/23页

【仪供笏否】

Spring和SpringMVC的问题在于需要配置大量的参数。

我们能否带来更多的智能?当一个MVCJAR添加到应用程序中的时候,我们能否自动配置一些

beans?

Spring查看(CLASSPATH上可用的框架)已存在的应用程序的配置。在此基础上,Spring

Boot提供了配置应用程序和框架所需要的基本配置。这就是自动配置。

10、SpringCloud缺点?

【仅供参考】

项目结构复杂,每一个组件或者每一个服务都需要创建一个项目。

部署门槛高,项目部署需要配合Docker等容器技术进行集群部署,而要想深入了解Docker,

学习成本高。

11、SpringBoOt中的监视器是什么?

【仅供参考】

Springbootactuator是SPring启动框架中的重要功能之一。Springboot监视器可帮助您访问

生产环境中正在运行的应用程序的当前状态。

有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务

来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTPURL访问的REST端点来检

查状态。

12、SpringInitializr是创建SpringBootProjects的唯一方法吗?

【仅供参考】

SpringInitiatlizr让创建SpringBoot项目变的很容易,但是,你也可以通过设置一个

maven项目并添加正确的依赖项来开始一个项目。

在我们的Spring课程中,我们使用两种方法来创建项目。

第一种方法是start,spring,io。

另外一种方法是在项目的标题为"BasicWebApplicationv处进行手动设置。

手动设置一个maven项目

这里有几个重要的步骤:

1、在Eclipse中,使用文件-新建Maven项目来创建一个新项目

2、添加依赖项。

3、添加maven插件。

4、添加SpringBoot应用程序类。

到这里,准备工作已经做好!

13、如何重新加载SPringBOot上的更改,而无需重新启动服务器?

【仅供参考】

这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat将重新启

动。

SpringBoOt有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。JaVa开发人

第12/23页

员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。

开发人员可以重新加载SPringBoot上的更改,而无需重新启动服务器。这将消除每次手动部署

更改的需要。SpringBOOt在发布它的第一个版本时没有这个功能。

这是开发人员最需要的功能。DeVTOOlS模块完全满足开发人员的需求。该模块将在生产环境中

被禁用。它还提供H2数据库控制台以更好地测试应用程序。

org.springframework.boot

spring-boot-devtools

14、JPA和Hibernate有哪些区别?

【仅供参考】

简而言之

JPA是一个规范或者接口

Hibernate是JPA的一个实现

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

hibernate的导入包。

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

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

15、为什么我们需要spring-boot-maven-plugin?

【仅供参考】

spring-boot-maven-plugin提供了一些像jar一样打包或者运行应用程序的命令。

1、spring-boot:run运行你的SpringBooty应用程序。

2、spring-boot:repackage重新打包你的jar包或者是war包使其可执行

3、spring-boot:start和spring-boot:stop管理SpringBoot应用程序的生命周期

(也可以说是为了集成测试)。

4、spring-boot:build-info生成执行器可以使用的构造信息。

16、开启SpringBoot特性有哪几种方式?

【仅供参考】

1)继承SPring-boot-starter-parent项目

2)导入SPring-boot-dependencies项目依赖

17、springboot有哪些方式可以实现热部署?

【仅供参考】

使用devtools启动热部署,添加devtools库,在配置文件中把spring,devtools.

restart,enabled设置为true;

使用IntellijIdea编辑器,勾上自动编译或手动重新编译。

18、SpringBoot实现热部署有哪几种方式?

【仅供参考】

主要有两种方式:

第13/23页

1、SpringLoaded

2、Spring-boot-devtools

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

【仅供参考】

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

20、什么是ORM框架?

【仅供参考】

ORM(ObjectRelationMapping)对象关系映射,是把数据库中的关系数据映射成为程序中的

对象。

使用ORM的优点:提高了开发效率降低了开发成本、开发更简单更对象化、可移植更强。

四、数据处理篇

1.RabbitMQ集群有什么用?

【仅供参考】

集群主要有以下两个用途:

高可用:某个服务器出现问题,整个RabbitMQ还可以继续使用;

高容量:集群可以承载更多的消息量。

2.RabbitMQ的使用场景有哪些?

【仅供参考】

抢购活动,削峰填谷,防止系统崩塌。

延迟信息处理,比如10分钟之后给下单未付款的用户发送邮件提醒。

解耦系统,对于新增的功能可以单独写模块扩展,比如用户确认评价之后,新增了给用户返积

分的功能,这个时候不用在业务代码里添加新增积分的功能,只需要把新增积分的接口订阅确

认评价的消息队列即可,后面再添加任何功能只需要订阅对应的消息队列即可。

3、RabbitMQ对集群节点停止顺序有要求吗?

【仅供参考】

RabbitMQ对集群的停止的顺序是有要求的,应该先关闭内存节点,最后再关闭磁盘节点。如果

顺序恰好相反的话,可能会造成消息的丢失。

4、RabbitMQ中VhoSt的作用是什么?

【仅供参考】

Vhost:每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机其实都是

mini版的RabbitMQ,它拥有自己的队列,交换器和绑定,拥有自己的权限机制。

第14/23页

5、RabbitMQ有几种广播类型?

【仅供参考】

direct(默认方式):最基础最简单的模式,发送方把消息发送给订阅方,如果有多个订阅

者,默认采取轮询的方式进行消息发送。

headers:与direct类似,只是性能很差,此类型几乎用不到。

fanout:分发模式,把消费分发给所有订阅者。

topic:匹配订阅模式,使用正则匹配到消息队列,能匹配到的都能接收到。

6、RabbitMQ持久化有什么缺点?

【仅供参考】

持久化的缺地就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,从而降低了吞吐

量。可尽量使用ssd硬盘来缓解吞吐量的问题。

7、什么情况下一个broker会从isr中踢出去?

【仅供参考】

Ieader会维护一个与其基本保持同步的RePIiCa列表,该列表称为ISR(in-syncReplica),每个

Partition都会有一个ISR,而且是由Ieader动态维护,如果一个follower比一个Ieader落后太

多,或者超过一定时间未发起数据复制请求,则Ieader将其重ISR中移除。

8、集群中有3台服务器,其中一个节点宕机,这个时候zookeeper还可以使用吗?

【仅供参考】

可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。

9、zookeeper都有哪些功能?

【仅供参考】

集群管理:监控节点存活状态、运行请求等。

主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个

选举的过程,使用zookeeper可以协助完成这个过程。

分布式锁:zookeeper提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资

源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也

只能有一个线程使用。ZookeePer可以对分布式锁进行控制。

命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或

服务的地址,提供者等信息。

10、当你使用kafka-topics.Sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?

【仅供参考】

1)会在ZOOkeePer中的/brokers/topics节点下创建一个新的topic节点,

如:/brokers/topics/first

2)触发ControlIer的监听程序

3)kafkaController负责topic的创建工作,并更新metadatacache

第15/23页

11、kafka分布式(不是单机)的情况下,如何保证消息的顺序消费?

【仅供参考】

Kafka分布式的单位是Partition,同一个Partition用一个WriteaheadIOg组织,所以可以保

证FIFo的顺序。不同PartitiOn之间不能保证顺序。但是绝大多数用户都可以通过messagekey

来定义,因为同一个key的MeSSage可以保证只发送到同一个PartitiOn。

Kafka中发送1条消息的时候,可以指定(topic,partition,key)3个参数。PartitOn和key是

可选的。如果你指定了Partition,那就是所有消息发往同Ijpartition,就是有序的。

并且在消费端,Kafka保证,1个PartitiOn只能被1个COnSUmer消费。或者你指定key(比如

orderid),具有同1个key的所有消息,会发往同1个Partitiono

12、zookeeper怎么保证主从节点的状态同步?

【仅供参考】

zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协

议叫做zab协议。zab协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服

务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数server

完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server

具有相同的系统状态。

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

【仅供参考】

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

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

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

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

【仅供参考】

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

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

的节奏进行慢慢处理。

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

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

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

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

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

常进行。

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

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

要的时候再去处理它们。

15、Kafka消息重复消费和消息丢包的解决办法?

LL枚俄叁老L

第16/23页

消费者(OffSet手动提交,业务逻辑成功处理后,提交OffSet)

保证不重复消费:落表(主键或者唯一索引的方式,避免重复数据)

业务逻辑处理(选择唯一主键存储到RediS或者mongdb中,先查询是否存在,若存在则不处理;

若不存在,先插入RediS或MOngdb,再进行业务逻辑处理)

自主维护offset判断不存在才插入值

采用kafka分区策略

第一种分区策略:给定了分区号,直接将数据发送到指定的分区里面去

第二种分区策略:没有给定分区号,给定数据的key值,通过key取上hashCode进行分区

第三种分区策略:既没有给定分区号,也没有给定key值,直接轮循进行分区

第四种分区策略:自定义分区

详细配置:

Flume1.9.0UserGuide一ApacheFlume

Kafka如何体现消息有序性的每个分区内,每条消息都有一个OffSet,故只能保证分区内有

序。如果为了保证topic整个有序,那么将PartitiOn调整为L

16、RediS支持的Java客户端都有哪些?

【仅供参考】

支持的JaVa客户端有RediSSon、jedis›lettuce等。

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

【仅供参考】

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

Redis使用场景:

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

缓存近期热帖;

缓存文章详情信息;

记录用户会话信息。

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

【仅供参考】

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

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

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

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

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

【仅供参考】

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

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

20、Redis和memcache有什么区别?

第17/23页

【仅供参考】

存储方式不同:memcache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;

Redis有部份存在硬盘上,这样能保证数据的持久性。

数据支持类型:memcache对数据类型支持相对简单;Redis有复杂的数据类型。

使用底层模型不同:它们之间底层实现方式,以及与客户端之间通信的应用协议不一样,Redis

自己构建了vm机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

value值大小不同:Redis最大可以达到512mb;memcache只有Imbo

五、MySQL数据库篇

1、什么是主备延迟?

【仅供参考】

主库和备库在执行同一个事务的时候出现时间差的问题,主要原因有:

有些部署条件下,备库所在机器的性能要比主库性能差。

备库的压力较大。

大事务,一个主库上语句执行10分钟,那么这个事务可能会导致从库延迟10分钟。

2、说一下MySQL的行锁和表锁?

【仅供参考】

MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最

低。

行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。

3、索引的常见类型以及它是如何发挥作用的?

【仅供参考】

根据叶子节点的内容,索引类型分为主键索引和非主键索引。

主键索引的叶子节点存的整行数据,在InnODB里也被称为聚簇索引。

非主键索引叶子节点存的主键的值,在InnoDB里也被称为二级索引。

4、MySQL的一主一备和一主多从有什么区别?

【仅供参考】

在一主一备的双M架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主

备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。

5、MySQL的大表查询为什么不会爆内存?

【仅供参考】

由于MySQL是边读变发,因此对于数据量很大的查询结果来说,不会再server端保存完整的

结果集,所以,如果客户端读结果不及时,会堵住MySQL的查询过程,但是不会把内存打爆。

第18/23页

InnoDB引擎内部,由于有淘汰策略,InnC)DB管理Buffer_Pool使用的是改进的LRU算法,

使用链表实现,实现上,按照5:3的比例把整个LRU链表分成了young区域和OId区域。

对冷数据的全扫描,影响也能做到可控制。

6.InnoDB为什么要用自增ID作为主键?

【仅供参考】

自增主键的插入模式,符合递增插入,每次都是追加操作,不涉及挪动记录,也不会触发叶子

节点的分裂。

每次插入新的记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个

新的页。

而有业务逻辑的字段做主键,不容易保证有序插入,由于每次插入主键的值近似于随机

因此每次新纪录都要被插到现有索引页得中间某个位置,频繁的移动、分页操作造成了大量的

碎片,得到了不够紧凑的索引结构,写数据成本较高。

7、说一下MySQL的锁?

【仅供参考】

MySQL在server层和存储引擎层都运用了大量的锁

MySQLserver层需要讲两种锁,第一种是MDL(metadatalock)元数据锁,第二种则Table

Lock表锁。

MDL又名元数据锁,那么什么是元数据呢,任何描述数据库的内容就是元数据,比如我们的表

结构、库结构等都是元数据。那为什么需要MDL呢?

主要解决两个问题:事务隔离问题;数据复制问题

InnoDB有五种表级锁:IS(意向读锁);IX(意向写锁);S(读);X(写);AUTO-INC

在对表进行SeleCt/insert/delete/update语句时候不会加表级锁

IS和IX的作用是为了判断表中是否有已经被加锁的记录

自增主键的保障就是有AUTO-INC锁,是语句级别的:为表的某个列添加AUTCLINCREMENT属

性,之后在插记录时,可以不指定该列的值,系统会动为它赋上单调递增的值。

InnoDB4种行级锁

RecordLock:记录锁

GapLock:间隙锁解决幻读;前一次查询不存在的东西在下一次查询出现了,其实就是事务A中

的两次查询之间事务B执行插入操作被事务A感知了

Next-KeyLock:锁住某条记录又想阻止其它事务在改记录前面的间隙插入新纪录

InsertIntentionLock:插入意向锁;如果插入到同一行间隙中的多个事务未插入到间隙内的同

一位置则无须等待

行锁和表锁的抉择

全表扫描用行级锁

8、如何高效的使用MySQL显式随机消息?

【仅供参考】

随机取出Y1,Y2,Y3之后,算出YmaX,Ymin

得到id集后算出Yl、Y2、Y3对应的三个id最后select*fromtwhereidin(idl,id2,

第19/23页

id3)这样扫描的行数应该是C+Ymax+3

mysql>selectcount(*)into@Cfromt;

set@Y1=floor(@C*rand());

set@Y2=floor(@C*rand());

set@Y3=floor(@C*rand());

Ymax=max(Yl,Y2,Y3)

Ymin=min(Yl,Y2,Y3)

selectidfromtlimitYmin,(Ymax-Ymin)

9、MySQL使用索引的原因?

【仅供参考】

根本原因

索引的出现,就是为了提高数据查询的效率,就像书的目录一样。

对于数据库的表而言,索引其实就是它的“目录”。

扩展

创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

帮助引擎层避免排序和临时表

将随机10变为顺序10,加速表和表之间的连接。

10、如果数据库误操作,如何执行数据恢复?

【仅供参考】

数据库在某个时候误操作,就可以找到距离误操作最近的时间节点的binlog,重放到临时数据

库里,然后选择误删的数据节点,恢复到线上数据库。

11、什么是覆盖索引和索引下推?

【仅供参考】

覆盖索引:

在某个查询里面,索引k已经“覆盖了”我们的查询需求,称为覆盖索引。

覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优

化手段。

索引下推:

MySQL5.6引入的索引下推优化(indexconditionpushdown),可以在索引遍历过程中,对

索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

12、原本可以执行得很快的SQL语句,执行速度却比预期的慢很多,原因是什么?如何解决?

【仅供参考】

原因:从大到小可分为四种情况

MySQL数据库本身被堵住了,比如:系统或网络资源不够。

SQL语句被堵住了,比如:表锁,行锁等,导致存储引擎不执行对应的SQL语句。

确实是索引使用不当,没有走索引。

表中数据的特点导致的,走了索引,但回表次数庞大。

第20/23页

解决:

考虑采用forceindex强行选择一个索引

考虑修改语句,引导MySQL使用我们期望的索引。比如把“orderbyblimit1”改成

morderbyb,alimitΓ,,语义的逻辑是相同的。

第三种方法是,在有些场景下,可以新建一个更合适的索引,来提供给优化器做选择,或删掉

误用的索引。

如果确定是索引根本没必要,可以考虑删除索引。

13、redoIOg日志格式

【仅供参考】

redologbuffer(内存中)是由首尾相连的四个文件组成的,它们分别是:ib_lOgfile_l、

ib_lOgfiie_2、ib_lOgfiIe_3、ib_lOgfiIe_4。

writepos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开

头。

checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据

文件。

writepos和checkpoint之间的是"粉板”上还空着的部分,可以用来记录新的操作。

如果writepos追上checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下

来先擦掉一些记录,把checkpoint推进一下。

有了redolog,当数据库发生宕机重启后,可通过redoIOg将未落盘的数据(checkPoint之

后的数据)恢复,保证已经提交的事务记录不会丢失,这种能力称为CraSh-safe。

14、redolog写入方式?

【仅供参考】

redoIog包括两部分内容,分别是内存中的日志缓冲(redologbuffer)和磁盘上的日志文件

(redologfile)o

MySQL每执行一条DML语句,会先把记录写入redo

温馨提示

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

评论

0/150

提交评论