




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023年Java(1~5年经验)面试题(一)
一、基础篇
1、如何实现对象克隆?
【仅供参考】
实现Cloneable接口并重写Object类中的clone。方法。
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现
真正的深度克隆。
2、重载(Overload)和重写(Override)的区别?
【仅供参考】
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态
性,而后者实现的是运行时的多态性。
重载:一个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不
同、参数个数不同或者二者都不同)。
重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不能改
变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变,
核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。
3、JDKL8之后有哪些新特性?
【仅供参考】
接口默认方法:Java8允许我们给接口添加一个非抽象的方法实现,只需要使
用default关键字即可
Lambda表达式和函数式接口:Lambda表达式本质上是一段匿名内部类,也可
以是一段可以传递的代码。Lambda允许把函数作为一个方法的参数(函数作为
参数传递到方法中),使用Lambda表达式使代码更加简洁,但是也不要滥用,
否则会有可读性等问题,《EffectiveJava》作者JoshBloch建议使用
Lambda表达式最好不要超过3行。
StreamAPI:用函数式编程方式在集合类上进行复杂操作的工具,配合Lambda
表达式可以方便的对集合进行处理。Java8中处理集合的关键抽象概念,它可
以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据
等操作。使用StreamAPI对集合数据进行操作,就类似于使用SQL执行的数
据库查询。也可以使用StreamAPI来并行执行操作。简而言之,StreamAPI
提供了一种高效且易于使用的处理数据的方式。
方法引用:方法引用提供了非常有用的语法,可以直接引用已有Java类或对象
(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更
紧凑简洁,减少冗余代码。
日期时间API:Java8引入了新的日期时间API改进了日期时间的管理。
Optional类:著名的NulIPointerException是引起系统失败最常见的原因。
很久以前GoogleGuava项目引入了Optional作为解决空指针异常的一种方
式,不赞成代码被null检查的代码污染,期望程序员写整洁的代码。受
GoogleGuava的鼓励,Optional现在是Java8库的一部分。
新工具:新的编译工具,如:Nashorn引擎jjs、类依赖分析器jdeps。
4、两个对象的hashCode()相同,则equals。是否也一定为true?
【仅供参考】
equals与hashcode的关系:
如果两个对象调用equals比较返回true,那么它们的hashCode值一定要相
同;
如果两个对象的hashCode相同,它们并不一定相同。
hashcode方法主要是用来提升对象比较的效率,先进行hashcode()的比较,如
果不相同,那就不必在进行equals的比较,这样就大大减少了equals比较的
次数,当比较对象的数量很大的时候能提升效率。
之所以重写equals。要重写hashcode(),是为了保证equals。方法返回true
的情况下hashcode值也要一致,如果重写了equals()没有重写hashcode(),
就会出现两个对象相等但hashcode。不相等的情况。这样,当用其中的一个对
象作为键保存到hashMap、hashTable或hashSet中,再以另一个对象作为键值
去查找他们的时候,则会查找不到。
5、Object常用方法有哪些?
【仅供参考】
Java面试经常会出现的一道题目,Object的常用方法。下面给大家整理一下。
Object常用方法有:toStringO>equals()>hashCode。、clone。等。
6、普通类和抽象类有哪些区别?
【仅供参考】
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
7、接口和抽象类有什么区别?
【仅供参考】
实现:抽象类的子类使用extends来继承;接口必须使用implements来实现
接口。
构造函数:抽象类可以有构造函数;接口不能有。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任
意访问修饰符。
8、用最有效率的方法计算2乘以8?
【仅供参考】
2«3。进阶:通常情况下,可以认为位运算是性能最高的。但是,其实编译
器现在已经“非常聪明了”,很多指令编译器都能自己做优化。所以在实际实
用中,我们无需特意去追求实用位运算,这样不仅会导致代码可读性很差,而
且某些自作聪明的优化反而会误导编译器,使得编译器无法进行更好的优化。
9、深拷贝和浅拷贝区别是什么?
【仅供参考】
浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引
用类型的成员对象并没有复制。
深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。
10、Java的特点?
【仅供参考】
Java具有平台独立性和移植性。
Java有一句口号:Writeonce,runanywhere,一次编写、到处运行。这也是
Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已编译的Java程
序可以在任何带有JVM的平台上运行。你可以在windows平台编写代码,然后
拿到linux上运行。只要你在编写完代码后,将代码编译成.class文件,再把
class文件打成Java包,这个jar包就可以在不同的平台上运行了。
Java具有稳健性。
Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。
Java要求显式的方法声明,它不支持C风格的隐式声明。这些严格的要求保证
编译程序能捕捉调用错误,这就导致更可靠的程序。
异常处理是Java中使得程序更稳健的另一个特征。异常是某种类似于错误的异
常条件出现的信号。使用try/catch/finally语句,程序员可以找到出错的处
理代码,这就简化了出错处理和恢复的任务。
11、JDK/JRE/JVM三者的关系
【仅供参考】
JVM
英文名称(JavaVirtualMachine),就是我们耳熟能详的Java虚拟机。Java
能够跨平台运行的核心在于JVM。
所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机
上执行。也就是说class文件并不直接与机器的操作系统交互,而是经过虚拟
机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
针对不同的系统有不同的jvm实现,有Linux版本的jvm实现,也有
Windows版本的jvm实现,但是同一段代码在编译后的字节码是一样的。这就
是Java能够跨平台,实现一次编写,多处运行的原因所在。
JRE
英文名称(JavaRuntimeEnvironment),就是Java运行时环境。我们编写的
Java程序必须要在JRE才能运行。它主要包含两个部分,JVM和Java核心类
库。
JRE是Java的运行环境,并不是一个开发环境,所以没有包含任何开发工具,
如编译器和调试器等。
如果你只是想运行Java程序,而不是开发Java程序的话,那么你只需要安装
JRE即可。
JDK
JDK目录下有个JRE,也就是JDK中已经集成了JRE,不用单独安装JRE。
另外,JDK中还有一些好用的工具,如jinfo,jps,jstack等。
JRE=JVM+Java核心类库
JDK=JRE+Java工具+编译器+调试器
12、String属于基础的数据类型吗?
【仅供参考】
String不属于基础类型,基础类型有8种:byte、boolean,char、short>
int、float、long>double,而String属于对象。
13、Files的常用方法都有哪些?
【仅供参考】
Files,exists():检测文件路径是否存在。
Files.createFileO:创建文件。
Files.createDirectory():创建文件夹。
Files,delete():删除一个文件或目录。
Files,copy():复制文件。
Files.moveO:移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files,write():写入文件。
14>Java中的Math,round(-1.5)等于多少?
【仅供参考】
等于-1,因为在数轴上取值时,中间值(0.5)向右取整,所以正0.5是往上
取整,负0.5是直接舍弃。
15、如何实现对象克隆?
【仅供参考】
实现Cloneable接口,重写clone()方法。这种方式是浅拷贝,即如果类中属
性有自定义引用类型,只拷贝引用,不拷贝引用指向的对象。如果对象的属性
的Class也实现Cloneable接口,那么在克隆对象时也会克隆属性,即深拷
贝。
结合序列化,深拷贝。
通过org.apache,commons中的工具类BeanUtiIs和PropertyUtiIs进行对象复
制。
16、JDK和JRE有什么区别?
【仅供参考】
JDK:JavaDevelopmentKit的简称,Java开发工具包,提供了Java的开发
环境和运行环境。
JRE:JavaRuntimeEnvironment的简称,Java运行环境,为Java的运行提
供了所需环境。
具体来说JDK其实包含了JRE,同时还包含了编译Java源码的编译器
Javac,还包含了很多Java程序调试和分析的工具。简单来说:如果你需要运
行Java程序,只需安装JRE就可以了,如果你需要编写Java程序,需要安
装JDK„
17、JVM是如何处理异常的?
【仅供参考】
在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给JVM,
该异常对象包含异
常名称,异常描述以及异常发生时应用程序的状态。创建异常对象并转交给
JVM的过程称为抛出
异常。可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法
调用的有序列表叫做
调用栈。
JVM会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常
处理代码。当JVM
发现可以处理异常的代码时,会把发生的异常传递给它。如果JVM没有找到可
以处理该异常的代
码块,JVM就会将该异常转交给默认的异常处理器(默认处理器为JVM的一部
分),默认异常处
理器打印出异常信息并终止应用程序。
18、运行时异常和一般异常(受检异常)区别是什么?
【仅供参考】
运行时异常包括RuntimeException类及其子类,表示JVM在运行期间可能出
现的异常。Java编
译器不会检查运行时异常。
受检异常是Exception中除RuntimeException及其子类之外的异常。Java
编译器会检查受检异常。
RuntimeException异常和受检异常之间的区别:是否强制要求调用者必须处理
此异常,如果强
制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常
(RuntimeException)0一般来讲,如果没有特殊的要求,我们建议使用
RuntimeException异常。
19、常见的RuntimeException有哪些?
【仅供参考】
ClassCastException(类转换异常)
IndexOulOfBoundsExceplion(数组越界)
NulIPointerException(空指针)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
还有10操作的BufferOverflowException异常
20^try-catch-finally中哪个部分可以省略?
【仅供参考】
try-catch-finally其中catch和finally都可以被省略,但是不能同时省
略,也就是说有try的时候,必须后面跟一个catch或者finally。
二、容器/多线程/反射/JVM/设计模式
1、ArrayList和LinkedList的区别是什么?
【仅供参考】
数据结构实现:ArrayList是动态数组的数据结构实现,而LinkedList是双
向链表的数据结构实现。
随机访问效率:ArrayList比LinkedList在随机访问的时候效率要高,因为
LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作,LinkedList要比ArrayList
效率要高,因为ArrayList增删操作要影响数组内的其他数据的下标。
综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插
入和删除操作较多时,更推荐使用LinkedList。
2^synchronized和Lock有什么区别?
【仅供参考】
synchronized可以给类、方法、代码块加锁;而lock只能给代码块加锁。
synchronized不需要手动获取锁和释放锁,使用简单,发生异常会自动释放
锁,不会造成死锁;而lock需要自己加锁和释放锁,如果使用不当没有
unLock()去释放锁就会造成死锁。
通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
3、四种线程池的创建:
【仅供参考】
(1)newCachedThreadPool创建一个可缓存线程池
(2)newFixedThreadPool创建一个定长线程池,可控制线程最大并发数。
(3)newSchedu1edThreadPoo1创建一个定长线程池,支持定时及周期性任务
执行。
(4)newSingleThreadExecutor创建••个单线程化的线程池,它只会用唯一
的工作线程来执行任务。
4、Linux环境下如何查找哪个线程使用CPU最长
【仅供参考】
(1)获取项目的pid,jps或者ps-ef|grepjava
(2)top-H-ppid,顺序不能改变
5、ThreadLocal是什么?有什么用?
【仅供参考】
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程
存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景
下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作
的场景。简单说ThreadLocal就是一种以空间换时间的做法,在每
个Thread里面维护了一个以开地址法实现的
ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线
程安全方面的问题了。
6、sleep()和wait()有什么区别?
【仅供参考】
类的不同:sleepO来自Thread,wait。来自Object。
释放锁:sleepO不释放锁;wait。释放锁。
用法不同:sleep。时间到会自动恢复;wail()可以使用
notify()/notifyAll()直接唤醒。
7、线程池的优点?
【仅供参考】
(1)重用存在的线程,减少对象创建销毁的开销。
(2)可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多
资源竞争,避免堵塞。
(3)提供定时执行、定期执行、单线程、并发数控制等功能。
8、线程池的核心属性有哪些?
【仅供参考】
threadFactory(线程工厂):用于创建工作线程的工厂。
corePoolSize(核心线程数):当线程池运行的线程少于corePoolSize时,将
创建一个新线程来处理请求,即使其他工作线程处于空闲状态。
workQueue(队列):用于保留任务并移交给工作线程的阻塞队列。
maximumPoolSize(最大线程数):线程池允许开启的最大线程数。
handler(拒绝策略):往线程池添加任务时,将在下面两种情况触发拒绝策
略:1)线程池运行状态不是RUNNING;2)线程池已经达到最大线程数,并且
阻塞队列已满时。
keepAliveTime(保持存活时间):如果线程池当前线程数超过corePoolSize,
则多余的线程空闲时间超过keepAliveTime时会被终止。
9、Executors类是什么?
【仅供参考】
Executors为Executor,ExecutorService,ScheduledExecutorService,
ThreadFactory和Callable
类提供了一些工具方法。Executors可以用于方便的创建线程池
10、Thread调用start()方法和调用run()方法的区别
【仅供参考】
run():普通的方法调用,在主线程中执行,不会新建一个线程来执行。
start():新启动一个线程,这时此线程处于就绪(可运行)状态,并没有运
行,一旦得到CPU时间片,就开始执行run()方法。
11、反射的缺点?
【仅供参考】
1、性能问题。
Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代
码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免
在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反
射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一
个问题。
2、安全限制。
使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提
出要求,则最好不要使用反射。
3、程序健壮性。
反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想
不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台
发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会
产生差异。
12、Java反射创建对象效率高还是通过new创建对象的效率高?
【仅供参考】
通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载
器创建,过程比较繁琐,所以效率较低。
13、下面的代码哪些地方会产生编译错误?
【仅供参考】
classOuter{
classInner{
publicstaticvoidfoo(){
newInner();
)
publicvoidbar(){
newInner();
}
publicstaticvoidmain(String[]args){
newInner();
)
)
Java中非静态内部类对象的创建要依赖其外部类对象,上面的面试题中f。。和
main方法都是静态方法,静态方法中没有this,也就是说没有所谓的外部类对
象,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这
样做:
newOuter().newInner();
在java编程中,用到反射的地方还是很多的,比如java框架就大量使用反
射,还有在加载驱动和读取配置文件时,反射也是比不可少的。所以在java面
试中,面试官会想要考察应聘者反射方面的知识,那么有面试需要的朋友,就
必须提前做好准备,将能搜集到的java反射面试题整理到一起记住,另外,
java零基础的小白也可以根据这篇java反射面试题来认识java反射。
14、实现java反射的类有什么?
【仅供参考】
(l)Class:表示正在运行的Java应用程序中的类和接口,注意所有获取对象的
信息都需要Class类来实现;
(2)Field:提供有关类和接口的属性信息,以及对它的动态访问权限;
(3)Constructor:提供关于类的单个构造方法的信息以及它的访问权限;
(4)Method:提供类或接口中某个方法的信息。
15、接口是什么?为什么要使用接口而不是直接使用具体类?
【仅供参考】
接口用于定义APE它定义了类必须得遵循的规则。同时,它提供了一种抽
象,因为客户端只使用接口,这样可以有多重实现,如List接口,你可以使
用可随机访问的ArrayList,也可以使用方便插入和删除的LinkedListo接口
中不允许写代码,以此来保证抽象,但是Java8中你可以在接口声明静态的
默认方法,这种方法是具体的。
16、设计一个ATM机,请说出你的设计思路?
【仅供参考】
比如设计金融系统来说,必须知道它们应该在任何情况下都能够正常工作。不
管是断电还是其他情况,ATM应该保持正确的状态(事务),想想加锁
(locking)、事务(transaction)、错误条件(errorcondition)、边界条件
(boundarycondition)等等。尽管你不能想到具体的设计,但如果你可以指
出非功能性需求,提出一些问题,想到关于边界条件,这些都会是很好的。
17、简述分代垃圾回收器是怎么工作的?
【仅供参考】
分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的
1/3,老生代的默认占比是2/3。
新生代使用的是复制算法,新生代里有3个分区:Eden、ToSurvivor,From
Survivor,它们的默认占比是8:1:1,它的执行流程如下:
把Eden+FromSurvivor存活的对象放入ToSurvivor区;
清空Eden和FromSurvivor分区;
FromSurvivor和ToSurvivor分区交换,FromSurvivor变ToSurvivor,
ToSurvivor变FromSurvivor。
每次在FromSurvivor到ToSurvivor移动时都存活的对象,年龄就+1,当
年龄到达15(默认配置是15)时,升级为老生代。大对象也会直接进入老生
代。
老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理
的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。
18、什么是双亲委派模型?
【仅供参考】
在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它
的类加载器和这个类本身一同确立在JVM中的唯一性,每一个类加载器,都有
一个独立的类名称空间。类加载器就是根据指定全限定名称将class文件加载
到JVM内存,然后再转化为class对象。
类加载器分类:
启动类加载器(BootstrapClassLoader),是虚拟机自身的一部分,用来加载
Java_HOME/lib/目录中的,或者被-Xbootclasspath参数所指定的路径中并且
被虚拟机识别的类库;
其他类加载器:
扩展类加载器(ExtensionClassLoader):负责加载〈java_homestyle="box-
sizing:border-box;outline:Opx!important;z/>libext目录或Java.ext.
dirs系统变量指定的路径中的所有类库;
应用程序类加载器(ApplicationClassLoader)»负责加载用户类路径
(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如
果我们没有自定义类加载器默认就是用这个加载器。
双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去加
载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是
如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加
载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝
试去加载类。
19、说一下JVM调优的工具?
【仅供参考】
JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是
jconsole和jvisualvm这两款视图监控工具。
jconsole:用于对JVM中的内存、线程和类等进行监控;
jvisualvm:JDK自带的全能分析工具,可以分析:内存快照、线程快照、程序
死锁、监控内存的变化、gc变化等。
20、说一下JVM有哪些垃圾回收器?
【仅供参考】
Serial:最早的单线程串行垃圾回收器。
SerialOld:Serial垃圾回收器的老年版本,同样也是单线程的,可以作为
CMS垃圾回收器的备选预案。
ParNew:是Serial的多线程版本。
Parallel和ParNew收集器类似是多线程的,但Parallel是吞吐量优先的收
集器,可以牺牲等待时间换取系统的吞吐量。
ParallelOld是Parallel老生代版本,Parallel使用的是复制的内存回收
算法,ParallelOld使用的是标记-整理的内存回收算法。
CMS:一种以获得最短停顿时间为目标的收集器,非常适用B/S系统。
G1:一种兼顾吞吐量和停顿时间的GC实现,是JDK9以后的默认GC选项。
三、JavaWeb/Spring/SpringMVC/Hibernate/MyBatis/Spring
Boot/SpringCloud
1、Servlet是线程安全的吗
【仅供参考】
Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。
解决的办法是尽量不要在实现servlet接口的类中定义实例变量,而是要把变
量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语
句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是
并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只
读属性最好定义为final类型的。
2、http和https的基本概念
【仅供参考】
-HTTP:
是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求
和应答的标准(TCP),用于计算机之间传输文字,图片,音频,视频等超文本
数据的协议,它可以使浏览器更加高效,使网络传输减少
-HTTPS:
是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入
SSL层,HTTPS的安全基础是SSL,HTTPS就是从HTTP加上加密处理(一般是
SSL安全通信线路)+认证+完整性保护
-HTTPS协议的主要作用:
建立一个信息安全通道,来保证数据传输的安全
确认网站的真实性
3、说一下JS0NP实现原理?
【仅供参考】
jsonp:JSONwithPadding,它是利用script标签的src连接可以访问不同
源的特性,加载远程返回的“JS函数”来执行的。
4、@Autowired的作用是什么?
【仅供参考】
@Autowired它可以对类成员变量、方法及构造函数进行标注,完成自动装配的
工作,通过@Aulowired的使用来消除set/get方法。
5、@RequestMapping的作用是什么?
【仅供参考】
将http请求映射到相应的类/方法上。
6、你如何理解SpringBoot中的Starters?
【仅供参考】
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,
你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。
如你想使用SpringJPA访问数据库,只要加入spring-boot-starter-data-
jpa启动器依赖就能使用了。
7、springboot集成mybatis的过程
【仅供参考】
添加mybatis的startermaven依赖
<dependency>
<groupld>org.mybatis.spring.boot</groupld>
<artifactld>mybatis-spring-boot-starter</artifactld>
<version>l.3.2</version>
</dependency>
在mybatis的接口中添加@Mapper注解
在application,yml配置数据源信息
8、开启SpringBoot特性有哪几种方式?
【仅供参考】
1)继承spring-boot-starter-parent项目
2)导入spring-boot-dependencies项目依赖
9、jpa和hibernate有什么区别?
【仅供参考】
jpa全称JavaPersistenceAPI,是Java持久化接口规范,hibernate属于
jpa的具体实现。
10、springboot有哪些方式可以实现热部署?
【仅供参考】
使用devtools启动热部署,添加devtools库,在配置文件中把spring,
devtools.restart,enabled设置为true;
使用IntellijIdea编辑器,勾上自动编译或手动重新编译。
11、为什么我们不建议在实际的应用程序中使用SpringDataRest?
【仅供参考】
我们认为SpringDataRest很适合快速原型制造!在大型应用程序中使用需
要谨慎。
通过SpringDataREST你可以把你的数据实体作为RESTful服务直接发布。
当你设计RESTful服务器的时候,最佳实践表明,你的接口应该考虑到两件重
要的事情:
你的模型范围。
你的客户。
通过WithSpringDataREST,你不需要再考虑这两个方面,只需要作为TEST
服务发布实体。
这就是为什么我们建议使用SpringDataRest在快速原型构造上面,或者作
为项目的初始解决方法。对于完整演变项目来说,这并不是一个好的注意。
12、RequestMapping和GetMapping的不同之处在哪里?
【仅供参考】
RequestMapping具有类属性的,可以进行GET,POST,PUT或者其它的注释中具
有的请求方法。GetMapping是GET请求方法中的一个特例。它只是
ResquestMapping的一个延伸,目的是为了提高清晰度。
13^springcloud的核心组件有哪些?
【仅供参考】
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求url地址,发
起请求。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔
离,避免了服务雪崩的问题。
Zuul:网关管理,由Zuul网关转发请求给对应的服务。
14、springcloud断路器的作用是什么?
【仅供参考】
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障
(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向
调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用
故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
15、Springboot有哪些优点?
【仅供参考】
-快速创建独立运行的spring项目与主流框架集成
-使用嵌入式的servlet容器,应用无需打包成war包
-starters自动依赖与版本控制
-大量的自动配置,简化开发,也可修改默认值
-准生产环境的运行应用监控
-与云计算的天然集成
16、什么是SpringDataREST?
【仅供参考】
SpringDataTEST可以用来发布关于Spring数据库的HATEOASRESTful资
源。
17、如何重新加载SpringBoot上的更改,而无需重新启动服务器?
【仅供参考】
这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入
式tomcat将重新启动。
SpringBoot有一个开发工具(DevTools)模块,它有助于提高开发人员的生
产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自
动重启服务器。
开发人员可以重新加载SpringBoot上的更改,而无需重新启动服务器。这将
消除每次手动部署更改的需要。SpringBoot在发布它的第一个版本时没有这
个功能。
这是开发人员最需要的功能。DevTools模块完全满足开发人员的需求。该模块
将在生产环境中被禁用。它还提供H2数据库控制台以更好地测试应用程序。
org.springframework,boot
spring-boot-devtools
18、MyBatis有哪些执行器(Executor)?
【仅供参考】
MyBatis有三种基本的Execulor执行器:
SimpleExecutor:每执行一次update或select就开启一个Statement对
象,用完立刻关闭Statement对象;
ReuseExecutor:执行update或select,以SQL作为key查找Statement
对象,存在就使用,不存在就创建,用完后不关闭Statement对象,而是放置
于Map内供下一次使用。简言之,就是重复使用Statement对象;
BatchExecutor:执行update(没有select,jdbc批处理不支持select),
将所有SQL都添加到批处理中(addBatch。),等待统一执行
(executeBatch()),它缓存了多个Statement对象,每个Statement对象都
是addBatch()完毕后,等待逐一执行executeBatch。批处理,与jdbc批处
理相同。
19、hibernate实体类可以被定义为final吗?
【仅供参考】
实体类可以定义为final类,但这样的话就不能使用hibernate代理模式下
的延迟关联提供性能了,所以不建议定义实体类为finale
20、MyBatis中#{}和${}的区别是什么?
【仅供参考】
\#{}是预编译处理,${}是字符替换。在使用时,MyBatis会将SQL中的
#{}替换成“?",配合PreparedStatement的set方法赋值,这样可以有效
的防止SQL注入,保证程序的运行安全。
四、Redis/RabbitMQ/Kafka/Zookeeper
1、RabbitMQ集群搭建需要注意哪些问题?
【仅供参考】
各节点之间使用“一link”连接,此属性不能忽略。
各节点使用的erlangcookie值必须相同,此值相当于“秘钥”的功能,用于
各节点的认证。
整个集群中必须包含一个磁盘节点。
2、RabbitMQ持久化有什么缺点?
【仅供参考】
持久化的缺地就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,
从而降低了吞吐量。可尽量使用ssd硬盘来缓解吞吐量的问题。
3、RabbitMQ怎么避免消息丢失?
【仅供参考】
把消息持久化磁盘,保证服务器重启消息不丢失。
每个集群中至少有一个物理磁盘,保证消息落入磁盘。
4、RabbitMQ中vhost的作用是什么?
【仅供参考】
vhost:每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟
主机其实都是mini版的RabbitMQ,它拥有自己的队列,交换器和绑定,拥有
自己的权限机制。
5、RabbitMQ的消息是怎么发送的?
【仅供参考】
首先客户端必须连接到RabbitMQ服务器才能发布和消费消息,客户端和
rabbitserver之间会创建一个tcp连接,一旦tcp打开并通过了认证(认
证就是你发送给rabbit服务器的用户名和密码),你的客户端和RabbitMQ就
创建了一条amqp信道(channel),信道是创建在"真实"tcp上的虚拟连
接,amqp命令都是通过信道发送出去的,每个信道都会有一个唯一的id,不
论是发布消息,订阅队列都是通过这个信道完成的。
6、RabbitMQ节点的类型有哪些?
【仅供参考】
磁盘节点:消息会存储到磁盘。
内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类型。
7、RabbitMQ集群有什么用?
【仅供参考】
集群主要有以下两个用途:
高可用:某个服务器出现问题,整个RabbitMQ还可以继续使用;
高容量:集群可以承载更多的消息量。
8、RabbitMQ怎么保证消息的稳定性?
【仅供参考】
提供了事务的功能。
通过将channel设置为confirm(确认)模式。
9、kafka如何减少数据丢失?
【仅供参考】
一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数据不丢
失,在面试中也会问到相关的问题。但凡遇到这种问题,是指3个方面的数据
不丢失,即:producerconsumer端数据不丢失broker端数据不丢失
10、为什么要使用kafka,为什么要使用消息队列?
【仅供参考】
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多
的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在
kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一
个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩
展能力。
冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic
的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影
响主要业务的正常进行。
异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步
处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放
入多少消息就放多少,然后在需要的时候再去处理它们。
11、kafka中的broker是干什么的?
【仅供参考】
broker是消息的代理,Producers往Brokers里面的指定Topic中写消息,
Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,
broker在中间起到一个代理保存消息的中转站。
12^zookeeper都有哪些功能?
【仅供参考】
集群管理:监控节点存活状态、运行请求等。
主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选
举说的就是这个选举的过程,使用zookeeper可以协助完成这个过程。
分布式锁:zookeeper提供两种锁:独占锁、共享锁。独占锁即一次只能有一
个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同
一个资源,如果要使用写锁也只能有一个线程使用。zookeeper可以对分布式
锁进行控制。
命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名
字来获取资源或服务的地址,提供者等信息。
13>zookeeper怎么保证主从节点的状态同步?
【仅供参考】
zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实
现这个机制的协议叫做zab协议。zab协议有两种模式,分别是恢复模式(选
主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab就进入了恢复
模式,当领导者被选举出来,且大多数server完成了和leader的状态同步
以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系
统状态。
14、集群中有3台服务器,其中一个节点宕机,这个时候zookeeper还可以
使用吗?
【仅供参考】
可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。
15、kafka可以脱离zookeeper单独使用吗?为什么?
【仅供参考】
kafka不能脱离zookeeper单独使用,因为kafka使用zookeeper管理和协
调kafka的节点服务器。
16、jedis和Redisson有哪些区别?
【仅供参考】
jedis:提供了比较全面的Redis命令的支持。
Redisson:实现了分布式和可扩展的Java数据结构,与jedis相比
Redisson的功能相对简单,不支持排序、事务、管道、分区等Redis特性。
17、Redis支持的Java客户端都有哪些?
【仅供参考】
支持的Java客户端有Redisson、jedis、lettuce等。
18、Redis持久化有几种方式?
【仅供参考】
Redis的持久化有两种方式,或者说有两种策略:
RDB(RedisDatabase):指定的时间间隔能对你的数据进行快照存储。
AOF(AppendOnlyFile):每一个收到的写命令都通过write函数追加到文件
中。
19、Redis为什么是单线程的?
【仅供参考】
因为cpu不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带
宽。既然单线程容易实现,而且cpu又不会成为瓶颈,那就顺理成章地采用单
线程的方案了。
关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。
而且单线程并不代表就慢nginx和nodejs也都是高性能单线程的代表。
20、Redis是什么?都有哪些使用场景?
【仅供参考】
Redis是一个使用C语言开发的高速缓存数据库。
Redis使用场景:
记录帖子点赞数、点击数、评论数;
缓存近期热帖;
缓存文章详情信息;
记录用户会话信息。
五、MySQL
1、哪些操作会导致索引失效?
【仅供参考】
对索引使用左或者左右模糊匹配,也就是like%xx或者like%xx%这两种方
式都会造成索引失效。原因在于查询的结果可能是多个,不知道从哪个索引值
开始比较,于是就只能通过全表扫描的方式来查询。
对索引进行函数/对索引进行表达式计算,因为索引保持的是索引字段的原始
值,而不是经过函数计算的值,自然就没办法走索引。
对索引进行隐式转换相当于使用了新函数。
WHERE子句中的OR语句,只要有条件列不是索引列,就会进行全表扫描。
2、误删数据怎么办?
【仅供参考】
DBA的最核心的工作就是保证数据的完整性,先要做好预防,预防的话大概是
通过这几个点:
权限控制与分配(数据库和服务器权限)
制作操作规范
定期给开发进行培训
搭建延迟备库
做好SQL审计,只要是对线上数据有更改操作的语句(DML和DDL)都需要进行
审核
做好备份。备份的话又分为两个点(1)如果数据量比较大,用物理备份
xtrabackupo定期对数据库进行全量备份,也可以做增量备份。(2)如果数据量
较少,用mysqldump或者mysqldumper。再利用binlog来恢复或者搭建主从
的方式来恢复数据。定期备份binlog文件也是很有必要的
如果发生了数据删除的操作,又可以从以下几个点来恢复:
DML误操作语句造成数据不完整或者丢失。可以通过flashback,美团的
myflash,也是一个不错的工具,本质都差不多
都是先解析binlogevent,然后在进行反转。把delete反转为insert,
insert反转为delete,update前后image对调。
所以必须设置binlog_format=ron和bin1og_row_image=fu11,切记恢复数据
的时候,应该先恢复到临时的实例,然后在恢复回主库上。
DDL语句误操作(truncate和drop),由于DDL语句不管binlog_format是
row还是statement,在binlog里都只记录语句,不记录image所以恢复
起来相对要麻烦得多。
只能通过全量备份+应用binlog的方式来恢复数据。一旦数据量比较大,那么
恢复时间就特别长
rm删除:使用备份跨机房,或者最好是跨城市保存。
3、如何理解MySQL的边读边发?
【仅供参考】
如果客户端接受慢,会导致MySQL服务端由于结果发不出去,这个事务的执行
时间会很长。
服务端并不需要保存一个完整的结果集,取数据和发数据的流程都是通过一个
next_buffer来操作的。
内存的数据页都是在BuffejPool中操作的。
InnoDB管理Buffer_Pool使用的是改进的LRU算法,使用链表实现,实现
上,按照5:3的比例把整个LRU链表分成了young区域和old区域。
4、都说InnoDB好,那还要不要使用MEMORY引擎?
【仅供参考】
内存表就是使用memory引擎创建的表
为什么我不建议你在生产环境上使用内存表。这里的原因主要包括两个方面:
锁粒度问题;数据持久化问题。
由于重启会丢数据,如果一个备库重启,会导致主备同步线程停止;如果主库
跟这个备库是双M架构,还可能导致主库的内存表数据被删掉。
5、为什么删除了表,表文件的大小还是没变?
【仅供参考】
数据项删除之后InnoDB某个页pageA会被标记为可复用。
delete命令把整个表的数据删除,结果就是,所有的数据页都会被标记为可复
用。但是磁盘上,文件不会变小。
经过大量增删改的表,都是可能是存在空洞的。这些空洞也占空间所以,如果
能够把这些空洞去掉,就能达到收缩表空间的目的。
重建表,就可以达到这样的目的。可以使用altertableAengine=InnoDB命
令来重建表。
6、MySQL使用索引的原因?
【仅供参考】
根本原因
索引的出现,就是为了提高数据查询的效率,就像书的目录一样。
对于数据库的表而言,索引其实就是它的“目录”。
扩展
创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
帮助引擎层避免排序和临时表
将随机10变为顺序10,加速表和表之间的连接。
7、详细说一下一条MySQL语句执行的步骤
【仅供参考】
Server层按顺序执行SQL的步骤为:
客户端请求->连接器(验证用户身份,给予权限)
查询缓存(存在缓存则直接返回,不存在则执行后续操作)
分析器(对SQL进行词法分析和语法分析操作)
优化器(主要对执行的SQL优化选择最优的执行方案方法)
执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接
口)->去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)
索引相关
8、MySQL有哪些自增ID?各自场景是什么?
【仅供参考】
表的自增ID达到上限之后,在申请值不会变化,进而导致联系插入数据的时
候报主键冲突错误。
row_id达到上限之后,归0在重新递增,如果出现相同的row_id后写的数
据会覆盖之前的数据。
Xid只需要不在同一个binlog文件出现重复值即可,理论上会出现重复值,
但概率极小可忽略不计。
InnoDB的max_trx_id递增值每次MySQL重启会保存起来。
Xid是由server层维护的。InnoDB内部使用Xid,就是为了能够在InnoDB
事务和server之间做关联。但是,InnoDB自己的trx_id,是另外维护的。
threadid是我们使用中最常见的,而且也是处理得最好的一个自增id逻辑
了。使用了insert_unique算法
9、join用法?
【仅供参考】
使用leftjoin左边的表不一定是驱动表
如果需要leftjoin的语义,就不能把被驱动表的字段放在where条件里面
做等值判断或不等值判断,必须都写在on里面
标准的groupby语句,是需要在select部分加一个聚合函数,比如select
a,count(*)fromtgroupbyaorderbynull;
10、如何最快的复制一张表?
【仅供参考】
为了避免对源表加读锁,更稳妥的方案是先将数据写到外部文本文件,然后再
写回目标表
一种方法是,使用mysqldump命令将数据导出成一组INSERT语句
另一种方法是直接将结果导出成.csv文件。MySQL提供语法,用来将查询结果
导出到服务端本地目录:select*fromdbl.twherea>900intooutfile
'/server_tmp/t.csv';得到.csv导出文件后,你就可以用下面的loaddata
命令将数据导入到目标表db2.t中:loaddatainfile'/server_tmp/t.csv)
intotabledb2.t;
物理拷贝:在MySQL5.6版本引入了可传输表空间(transportable
tablespace)的方法,可以通过导出+导入表空间的方式,实现物理拷贝表的
功能。
11、MySQL的changebuffer是什么?
【仅供参考】
当需要更新一个数据页时,如果数据页在内存中就直接更新;而如果这个数据
页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新
r
操作缓存在changebuffer|='o
这样就不需要从磁盘中读入这个数据页了,在下次查询需要访问这个数据页的
时候,将数据页读入内存,然后执行changebuffer中与这个页有关的操作。
通过这种方式就能保证这个数据逻辑的正确性。
注意唯一索引的更新就不能使用changebuffer,实际上也只有普通索引可以
使用。
适用场景:
-对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此
时changebuffer的使用效果最好。这种业务模型常见的就是账单类、日志类
的系统。
-反过来,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足
了条件,将更新先记录在changebuffer,但之后由于马上要访问这个数据
页,会立即触发merge过程。这样随机访问10的次数不会减少,反而增加了
changebuffer的维护代价。
12、InnoDB数据页结构?
【仅供参考】
一个数据页大致划分七个部分
FileHeader:表示页的一些通用信息,占固定的38字节。
pageHeader:表示数据页专有信息,占固定的56字节。
inimum+Supermum:两个虚拟的伪记录,分别表示页中的最小记录和最大记录,
占固定的26字节。
UserRecords:真正存储我们插入的数据,大小不固定。
FreeSpace:页中尚未使用的部分,大小不固定。
PageDirectory:页中某些记录的相对位置,也就是各个槽对应的记录在页面
中的地址偏移量。
FileTrailer:用于检验页是否完整,占固定大小8字节。
数据相关
13、MySQL的一主一备和一主多从有什么区别?
【仅供参考】
在一主一备的双M架构里,主备切换只需要把客户端流量切到备库;而在一主
多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新
主库上。
14、drop、truncate和delete的区别?
【仅供参考】
DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操
作作为事务记录在日志中保存以便进行进行回滚操作。
TRUNCATETABLE则一次性地从表中删除所有的数据并不把单独的删除操作记录
记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关
的删除触发器。执行速度快。
drop语句将表所占用的空间全释放掉。
在速度上,一般来说,drop>truncate>delete。
如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;
如果想删除表,当
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年冬至主题活动策划方案
- 2025年幼儿园下期工作方案
- 邮政金融知识培训课件
- 三亚学院《设计初步创作思维》2023-2024学年第二学期期末试卷
- 山东省济南市部分区县2025届高三二诊测试(物理试题理)试题含解析
- 湖北远安栖凤联盟2025届五下数学期末复习检测试题含答案
- 宿迁职业技术学院《现代商务管理学》2023-2024学年第二学期期末试卷
- 湖北省天门天宜国际校2025届初三下学期第四次质量检测试题英语试题含答案
- 2025年贵州省黔东南州凯里六中学初三下学期9月初态考试英语试题含答案
- 内蒙古经贸外语职业学院《流体力学土建类》2023-2024学年第一学期期末试卷
- GB/T 35607-2024绿色产品评价家具
- CJJT153-2010 城镇燃气标志标准
- 急救药品、物品交接记录
- QBT 2262-1996 皮革工业术语
- 课件:件杂货船舶理货操作程序(改)讲解
- 质量通病防治指引(二次结构)
- 2024年公务员考试常识题400道及答案【新】
- 2024年辅警招聘考试试题库含完整答案(各地真题)
- 房屋设计自学教程
- 【真题】2023年淮安市中考道德与法治试卷(含答案解析)
- 太原市2024年高三一模(高三年级模拟考试一)英语试卷(含答案)
评论
0/150
提交评论