《2022年Java经典面试题.pdf》由会员分享,可在线阅读,更多相关《2022年Java经典面试题.pdf(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2 0 2 2 年 J av a经典面试题(一)一、基础篇1、如何实现对象克隆?【仅供参考】实现C lo n e able 接口,重 写 clo n e。方法。这种方式是浅拷贝,即如果类中属性有自定义引用类型,只拷贝引用,不拷贝引用指向的对象。如果对象的属性的C las s 也实现C lo n e able 接口,那么在克隆对象时也会克隆属性,即深拷贝。结合序列化,深拷贝。通过 o r g.ap ach e,co mmo n s 中的工具类 B e an U t i I s 和 P r o p e r t y U t i ls 进行对象复制。2、O bj e ct 常用方法有哪些?【仅供参考】
2、J av a面试经常会出现的一道题目,O bj e ct 的常用方法。下面给大家整理一下。O bj e ct 常用方法有:t o S t r i n gO e q u als。、h as h C o de ()clo n e。等。3、深拷贝和浅拷贝区别是什么?【仅供参考】浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。4、J av a中操作字符串都有哪些类?它们之间有什么区别?【仅供参考】操作字符串的类有:S t r i n g,S t r i n gB u ffe r S t r
3、i n gB u i lde t oS t r i n g 和 S t r i n gB u ffe r S t r i n gB u i I de r 的区别在于 S t r i n g 声明的是不可变的对象,每次操作都会生成新的S t r i n g对象,然后将指针指向新的S t r i n g对象,而 S t r i n gB u ffe r、S t r i n gB u i lde r 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用S t r i n goS t r i n gB u ffe r 和 S t r i n gB u i lde r 最大的区别
4、在于,S t r i n gB u ffe r 是线程安全的,而 S t r i n gB u i lde r 是非线程安全的,但S t r i n gB u i I de r 的性能却高于S t r i n gB u ffe r,所以在单线程环境下推荐使用S t r i n gB u i lde r,多线程环境下推荐使用 S t r i n gB u ffe ro5、&和&的区别?【仅供参考】&:逻辑与运算符。当运算符左右两边的表达式都为t r u e,才返回t r u e。同时具有短路性,如果第一个表达式为fals e,则直接返回fals e。&:逻辑与运算符、按位与运算符。按位与运算符:
5、用于二进制的计算,只有对应的两个二进位均为1 时,结果位才为1,否则为0。逻辑与运算符:&在用于逻辑与时,和&的区别是不具有短路性。所在通常使用逻辑与运算符都会使用&,而&更多的适用于位运算。6、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?【仅供参考】值传递。J av a中只有值传递,对于对象参数,值的内容是对象的引用。7、=和 e q u als 的区别是什么?【仅供参考】对于基本类型和引用类型=的作用效果是不同的。基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;e q u als 本质上就是=,只不
6、过St r i n g 和 I n t e g e r 等重写了 e q u a ls 方法。=对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而e q u a ls 默认情况下是引用比较,只是很多类重新了 e q u a ls 方法,比如St r i n g s I n t e g e r 等把它变成了值比较,所以一般情况下e q u a ls 比较的是值是否相等。8、用最有效率的方法计算2 乘以8?【仅供参考】2 3 o 进阶:通常情况下,可以认为位运算是性能最高的。但是,其实编译器现在已经“非常聪明了”,很多指令编译器都能自己做优化。所以在实际实用中,我们无需特意去追求实用位运
7、算,这样不仅会导致代码可读性很差,而且某些自作聪明的优化反而会误导编译器,使得编译器无法进行更好的优化。9、BI O、N I O、A I 0 有什么区别?【仅供参考】BI O:Blo c k 1 0 同步阻塞式1 0,就是我们平常使用的传统1 0,它的特点是模式简单使用方便,并发处理能力低。N I O:N o n 1 0 同步非阻塞1 0,是传统1 0 的升级,客户端和服务器端通过C h a n n e l(通道)通讯,实现了多路复用。A I O:A s y n c h r o n o u s 1 0 是 N I 0 的升级,也叫N I 0 2,实现了异步非堵塞1 0 ,异 步 1 0 的操作
8、基于事件和回调机制。1 0、JD K/JR E/JV M 三者的关系【仅供参考】JV M英文名称(Ja v a V i r t u a l M a c h i n e),就是我们耳熟能详的Ja v a 虚拟机。Ja v a能够跨平台运行的核心在于JV M。所有的j a v a 程序会首先被编译为.c la s s 的类文件,这种类文件可以在虚拟机上执行。也就是说c la s s 文件并不直接与机器的操作系统交互,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。针对不同的系统有不同的j v m 实现,有 Li n u x 版本的j v m 实现,也有W i n d o w s
9、 版本的j v m 实现,但是同一段代码在编译后的字节码是一样的。这就是 Jav a能够跨平台,实现一次编写,多处运行的原因所在。JR E英文名称(Jav a R u n t i m e E n v i r o n m e n t),就是Jav a运行时环境。我们编写的Jav a程序必须要在JR E 才能运行。它主要包含两个部分,JV M和 Jav a核心类库。JR E 是 Jav a的运行环境,并不是一个开发环境,所以没有包含任何开发工具,如编译器和调试器等。如果你只是想运行Jav a程序,而不是开发Jav a程序的话,那么你只需要安装JR E 即可。JD KJD K目录下有个JR E,也就
10、是JD K中已经集成了 JR E,不用单独安装JR E。另外,JD K中还有一些好用的工具,如j i n f o,j p s,j s t ac k 等。JR E =JV M+Jav a核心类库JD K=JR E +Jav a工 具+编译器+调试器1 1、普通类和抽象类有哪些区别?【仅供参考】普通类不能包含抽象方法,抽象类可以包含抽象方法。抽象类不能直接实例化,普通类可以直接实例化。1 2、重 载(O v e r l o ad)和重写(O v e r r i d e)的区别?【仅供参考】方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载:一
11、个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)。重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不能改变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。1 3、S t r i n g 是 Jav a基本数据类型吗?【仅供参考】不是。Jav a中的基本数据类型只有8 个:b y t e、s h o r t、i n t、l o n g、f l o at、d o u b l e、c h ar b o o l e an;除了基本类型(p r i m i t i v
12、 e t y p e),剩下的都是引用类 型(r e f e r e n c e t y p e)。基本数据类型:数据直接存储在栈上引用数据类型区别:数据存储在堆上,栈上只存储引用地址1 4、f i n al、f i n al l y,f i n al i z e 有什么区别?【仅供参考】f i n al 可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。f i n al l y 一般作用在t r y-c at c h 代码块中,在处理异常的时候,通常我们将一定要执行的代码方法f i n al l y 代码块中,表示不管
13、是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。f i n al i z e 是一个方法,属于O b j e c t 类 的 个方法,而 O b j e c t 类是所有类的父类,Jav a中允许使用f i n al i z e。方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。1 5、t r y-c at c h-f i n al l y 中哪个部分可以省略?【仅供参考】c at c h 可以省略更为严格的说法其实是:t r y 只适合处理运行时异常,t r y+c at c h 适合处理运行时异常+普通异常。也就是说,如果你只用t r y 去处理普通异常却不加以c
14、 at c h 处理,编译是通不过的,因为编译器硬性规定,普通异常如果选择捕获,则必须用c at c h 显示声明以便进一步处理。而运行时异常在编译时没有如此规定,所以c at c h 可以省略,你加上c at c h 编译器也觉得无可厚非。理论上,编译器看任何代码都不顺眼,都觉得可能有潜在的问题,所以你即使对所有代码加上t r y,代码在运行期时也只不过是在正常运行的基础上加一层皮。但是你一旦对一段代码加上t r y,就等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常,编译器要求必须用c at c h 捕获以便进一步处理;如果运行时异常,捕获然后丢弃并且
15、+f i n al l y 扫尾处理,或者加上c at c h 捕获以便进一步处理。至于加上f i n al l y,则是在不管有没捕获异常,都要进行的“扫尾”处理。1 6、t r y-c at c h-f i n al l y 中,如果 c at c h 中 r e t u r n 了,f i n al l y 还会执行吗?【仅供参考】答:会执行,在 r e t u r n 前执行。注意:在 f i n al l y 中改变返回值的做法是不好的,因为如果存在f i n al l y 代码块,t r y 中的r e t u r n 语句不会立马返回调用者,而是记录下返回值待f i n al l
16、 y 代码块执行完毕之后再向调用者返回其值,然后如果在f i n al l y 中修改了返回值,就会返回修改后的值。显然,在f i n al l y 中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,J a va中也可以通过提升编译器的语法检查级别来产生警告或错误。1 7、t h r o w 和 t h r o w s 的区别是什么?【仅供参考】J a va 中的异常处理除了包括捕获异常和处理异常之外,还包括声明异常和抛出异常,可以通过t h r o w s 关键字在方法上声明该方法要抛出的异常,或者在方法内部通过t h r o w抛出异常对象
17、。t h r o w s 关键字和t h r o w 关键字在使用上的几点区别如下:t h r o w 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。t h r o w s 关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。一个方法用t h r o w s 标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用t h r o w s 关键字声明相应的异常。1 8、常见的 Ru n t i m e E xc e p t i o n 有哪些?【仅供参考】C l a s s C
18、a s t E xc e p t i o n (类转换异常)I n d e xO u t O f B o u n d s E xc e p t i o n (数组越界)N u l I P o i n t e r E xc e p t i o n (空指针)A r r a yS t o r e E xc e p t i o n (数据存储异常,操作数组时类型不一致)还有 1 0 操作的 B u f f e r O ve r f 1 o w E xc e p t i o n 异常1 9、运行时异常和一般异常(受检异常)区别是什么?【仅供参考】运行时异常包括Ru n t i m e E xc e p
19、 t i o n 类及其子类,表 示 J V M 在运行期间可能出现的异常。J a va 编译器不会检查运行时异常。受检异常是E xc e p t i o n 中 除 Ru n t i m e E xc e p t i o n 及其子类之外的异常。J a va编译器会检查受检异常。Ru n t i m e E xc e p t i o n 异常和受检异常之间的区别:是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常(Ru n t i m e E xc e p t i o n)0 一般来讲,如果没有特殊的要求,我们建议使用Ru n t i
20、m e E xc e p t i o n 异常。2 0、f i n a l f i n a l l y、f i n a l i ze 有什么区别?【仅供参考】f i n a l:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。f i n a l l y:是 t r y c a t c h f i n a l l y最后一部分,表示不论发生任何情况都会执行,f i n a l l y部分可以省略,但如果f i n a l l y部分存在,则一定会执行f i n a l l y里面的代码。f i n a l i ze:是 O b j e c t
21、 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。二、容器/多线程/反射/J V M/设计模式1、L i s t、S e t、M a p 之间的区别是什么?【仅供参考】L i s t、S e t、M a p 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。Li st元素有序且允许重复。S et元素无序(A bstractS et和 Hash set无序,T reeS et二叉树排序,元素有序),不允许重复。Map 元素无序(A bsl racl Map 和Hash m ap 无序,T reeMap 二叉树排序,元素有序),k ey值必须唯一,val ue可以重复。2、怎
22、么确保一个集合不能被修改?【仅供参考】可以使用 C o l l ecti o n s,un m o di fi abl eC o l l ecti o n (C o l l ecti o n c)方法来创建一个只读集合,这样改变集合的任何操作都会抛出Java.l an g.U n sup p o rtedO p erati o n E x cep ti o n 异常。示例代码如下:Li st l i st=n ew A rrayLi stO();l i st.add(x);C o l l ecti o n cl i st=C o l l ecti o n s.un m o di fi abl
23、eC o l l ecti o n(l i st);cl i st.add(V);/运行时此行报错S ystem,o ut.p ri n ti n (l i st,si z e();3、那在什么时候用链表?什么时候用红黑树?【仅供参考】对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后超过 8个(阈值8):如果此时数组长度大于等于6 4,则会触发链表节点转红黑树节点(treei fyB i n);而如果数组长度小于6 4,则不会触发链表转红黑树,而是会进行扩容,因为此时的数据量还比较小。对于移除,当同一个索引位置的节点在移除后达到6个,并且该索引位置的节点为红黑树节点,会触发红
24、黑树节点转链表节点(un treei fy)o4、迭代器Iterato r是什么?【仅供参考】Iterato r接口提供遍历任何C o l l ecti o n 的接口。我们可以从一个C o l l ecti o n 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java集合框架中的E n um erati o n,迭代器允许调用者在迭代过程中移除元素。5、Java死锁以及如何避免?【仅供参考】Java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源。Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请。6、线程的调度策略【仅供参考
25、】线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行:(1)线程体中调用了 y i e l d 方法让出了对c p u 的占用权利(2)线程体中调用了 s l e e p 方法使线程进入睡眠状态(3)线程由于1 0 操作受到阻塞(4)另外一个更高优先级线程出现(5)在支持时间片的系统中,该线程的时间片用完7、不可变对象对多线程有什么帮助【仅供参考】前面有提到过的一个问题,不可变对象保证了对象的内存可见性,对不可变对象的读取不需要进行额外的同步手段,提升了代码执行效率。8、v o l a t i l e 关键字的作用【仅供参考】对于可见性,J a v a 提供了 v
26、o l a t i l e 关键字来保证可见性。当一个共享变量被v o l a t i l e 修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。从实践角度而言,v o l a t i l e 的一个重要作用就是和C AS 结合,保证了原子性,详细的可以参见j a v a.u t i l,c o n c u r r e n t,a t o m i c 包下的类,比如 At o m i c l n t e g e ro9、T h r e a d 调 用 s t a r t ()方法和调用r u n ()方法的区别【仅供参考】r u n():普通的方法调用,
27、在主线程中执行,不会新建一个线程来执行。s t a r t ():新启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到C P U 时间片,就开始执行r u n()方法。1 0、J a v a 反射创建对象效率高还是通过n e w 创建对象的效率高?【仅供参考】通过n e w 创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。1 1、实现j a v a 反射的类有什么?【仅供参考】(l)C l a s s:表示正在运行的J a v a 应用程序中的类和接口,注意所有获取对象的信息都需要C l a s s 类来实现;(2)F i e
28、l d:提供有关类和接口的属性信息,以及对它的动态访问权限;(3)C o n s t r u c t o r:提供关于类的单个构造方法的信息以及它的访问权限;(4)M e t h o d:提供类或接口中某个方法的信息。1 2、反射的实现方式都有什么?【仅供参考】获取C l a s s 对象,有 4 种方法:C l a s s.f o r N a m e(“类的路径”);类名.c l a s s;(3)对象名.g e t C l a s s O;(4)基本类型的包装类,可以调用包装类的T y p e 属性来获得该包装类的C l a s s 对象。1 3、J a v a 反射机制主要提供了哪些功能
29、?【仅供参考】在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。1 4、什么是设计模式?你是否在你的代码里面使用过任何设计模式?【仅供参考】设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸1 5、说一下J V M 有哪些垃圾回收器?【仅供参考】S e r i a l:最早的单线程串行垃圾回收器。S e r i a l O l d:S e r i a l 垃圾回收器的老年版本,同样也是单线程的,可以作为C M S 垃圾回收器的备选预案。P a
30、r N e w:是 S e r i a l 的多线程版本。P a r a l l e l 和 P a r N e w 收集器类似是多线程的,但 P a r a l l e l 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。P a r a l l e l O l d 是 P a r a l l e l 老生代版本,P a r a l l e l 使用的是复制的内存回收算法,P a r a l l e l O l d 使用的是标记-整理的内存回收算法。C M S:一种以获得最短停顿时间为目标的收集器,非常适用B/S 系统。G 1:一种兼顾吞吐量和停顿时间的G C 实现,是 J D K 9
31、以后的默认G C 选项。1 6、新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?【仅供参考】新生代回收器:S e r i a l P a r N e w、P a r a l l e i S c a v e n g e老年代回收器:S e r i a l O l d、P a r a l l e l O l d、C M S整堆回收器:G 1新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。1 7、队列和栈是什么?有什么区别?【仅供参考】队列和栈都是被用来预存储数据的。队列允许先进先出检索元素,但也有例外的
32、情况,D e q u e 接口允许从两端检索元素。栈和队列很相似,但它运行对元素进行后进先出进行检索。1 8、类加载的过程【仅供参考】类加载的过程包括:加载、验证、准备、解析、初始化,其中验证、准备、解析统称为连接。加载:通过一个类的全限定名来获取定义此类的二进制字节流,在内存中生成一个代表这个类的j a v a.l a n g.C l a s s 对象。验证:确保C l a s s 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。准备:为静态变量分配内存并设置静态变量初始值,这里所说的初始值“通常情况”下是数据类型的零值。解析:将常量池内的符号引用替换为直接引用。
33、初始化:到了初始化阶段,才真正开始执行类中定义的J a v a 初始化程序代码。主要是静态变量赋值动作和静态语句块(s t a t i c)中的语句。1 9、说一下J VM 的主要组成部分?及其作用?【仅供参考】类加载器(C l a s s L o a d e r)运行时数据区(R u n t i m e D a t a A r e a)执行引擎(E x e c u t i o n E n g i n e)本地库接口(N a t i v e I n t e r f a c e)组件的作用:首先通过类加载器(C l a s s L o a d e r)会 把 J a v a 代码转换成字节码,运
34、行时数据区(R u n t i m e D a t a A r e a)再把字节码加载到内存中,而字节码文件只是J VM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(E x e c u t i o n E n g i n e),将字节码翻译成底层系统指令,再交由C P U 去执行,而这个过程中需要调用其他语言的本地库接口(N a t i v e I n t e r f a c e)来实现整个程序的功能。2 0、说一下类装载的执行过程?【仅供参考】类装载分为以下5个步骤:加载:根据查找路径找到相应的clas s 文件然后导入;检查:检查加载的clas s
35、 文件的正确性;准备:给类中的静态变量分配内存空间;解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;初始化:对静态变量和静态代码块执行初始化工作。三、J av a Web/S pr ing/S pr ing M V C/H iber nat e/M y B at is/S pr ingB o o t/S pr ing C lo u d1、J S P 和 s er v let 有什么区别?【仅供参考】J S P 是 s er v let 技术的扩展,本质上就是s er v let 的简易方式。s er v let 和J S P 最
36、主要的不同点在于,s er v let 的应用逻辑是在J av a文件中,并且完全从表示层中的ht ml里分离开来,而 J S P 的情况是J av a和 ht ml可以组合成一个扩展名为J S P 的文件。J S P 侧重于视图,s er v let 主要用于控制逻辑。2、T C P 和 U D P 的区别【仅供参考】1、T C P :面向连接,U D P :面向无连接2、T C P :传输效率低,U D P :传输效率高(有大小限制,一次限定在6 4 kb之内)3、T C P:可靠,U D P :不可靠3、ht t p响应码3 0 1 和 3 0 2 代表的是什么?有什么区别?【仅供参考】
37、3 0 1:永久重定向。3 0 2:暂时重定向。它们的区别是,3 0 1 对搜索引擎优化(S E 0)更加有利;3 0 2 有被提示为网络拦截的风险。4、一次完整的H T T P 请求所经历几个步骤?【仅供参考】根据域名和D N S 解析到服务器的工P 地 址(D N S +C D N)通过A R P 协议获得I P 地址对应的物理机器的M A C 地址浏览器对服务器发起T C P 3次握手建 立 TCP 连接后发起H TTP 请求报文服务器响应H TTP 请求,将响应报文返回给浏览器短连接情况下,请求结束则通过TCP 四次挥手关闭连接,长连接在没有访问服务器的若干时间后,进行连接的关闭浏览器
38、得到响应信息中的H TM L 代码,并请求H TM L 代码中的资源(如 j s、c ss、图片等)浏览器对页面进行渲染并呈现给用户5、sprin g 常用的注入方式有哪些?【仅供参考】se t t e r属性注入构造方法注入注解方式注入6、sprin g m v c 有哪些组件?【仅供参考】前置控制器 Dispa t c he rS e rv l e t o映射控制器H a n d l e rM a ppin g o处理器 Co n t ro l l e ro模型和视图M o d e 1 A n d Vie w o视图解析器Vie w R e so l v e ro7、为什么要使用sprin
39、 g?【仅供参考】sprin g 提 供 io c 技术,容器会帮你管理依赖的对象,从而不需要自己创建和管理依赖对象了,更轻松的实现了程序的解耦。sprin g 提供了事务支持,使得事务操作变的更加方便。sprin g 提供了面向切片编程,这样可以更方便的处理某一类的问题。更方便的框架集成,sprin g 可以很方便的集成其他框架,比如M y B a t is hib e rn a t e 等。8、解释一下什么是a o p?【仅供参考】a o p是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日
40、志、异常等。9、R e qu e st M a ppin g 和 G e t M a ppin g 的不同之处在哪里?【仅供参考】R e qu e st M a ppin g 具有类属性的,可以进行G E T,P O S T,P UT或者其它的注释中具有的请求方法。G e t M a ppin g 是 G E T请求方法中的一个特例。它只是R e squ e st M a ppin g 的一个延伸,目的是为了提高清晰度。1 0、如何在S p r i n g B o o t 中添加通用的J S 代码?【仅供参考】在源文件夹下,创建一个名为s t a t i c 的文件夹。然后,你可以把你的静态的
41、内容放在这里面。例如,m y a p p.j s 的路径是 r e s o u r c e s s t a t i c j s m y a p p.j s1 1、S p r i n g B o o t 中的监视器是什么?【仅供参考】S p r i n g b o o t a c t u a t o r 是 s p r i n g 启动框架中的重要功能之一。S p r i n g b o o t 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HT
42、TP URL访问的REST端点来检查状态。1 2、S p r i n g C l o u d 优点?【仅供参考】集大成者,Spring Cloud包含了微服务架构的方方面面。约定优于配置,基于注解,没有配置文件。轻量级组件,Spring Cloud整合的组件大多比较轻量级,且都是各自领域的佼佼者。开发简便,Spring Cloud对各个组件进行了大量的封装,从而简化了开发。开发灵活,Spring Cloud的组件都是解耦的,开发人员可以灵活按需选择组件。1 3、S p r i n g B o o t 实现热部署有哪几种方式?【仅供参考】主要有两种方式:1、Spring Loaded2、Spri
43、ng-boot-devtools1 4、j p a 和 h i b e r n a t e 有什么区别?【仅供参考】jpa 全称 Java Persistence API,是 Java 持久化接口规范,hibernate 属于jpa的具体实现。1 5、S p r i n g B o o t 还提供了其它的哪些 S t a r t e r Pr o j e c t Op t i o n s?【仅供参考】Spring Boot也提供了其它的启动器项目包括,包括用于开发特定类型应用程序的典型依赖项。spring-boot-starter-web-services-SOAP Web Services;
44、spring-boot-starter-web-Web 和 RESTful 应用程序;spring-boot-starter-test-单元测试和集成测试;spring-boot-starter-jdbc-传统的 JDBC;spring-boot-starter-hateoas-为服务添加 HATE0AS 功能;spring-boot-starter-security-使用 SpringSecurity 进行身份验证和授权;spring-boot-starter-data-jpa-带有 Hibeernate 的 Spring Data JPA;spring-boot-starter-data-
45、rest-使用 Spring Data REST 公布简单的 REST服务;16、什么是 spring cloud?【仅供参考】spring cloud是一系列框架的有序集合。它利用spring boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用spring boot的开发风格做到一键启动和部署。17、创建一个Spring Boot Project的最简单的方法是什么?【仅供参考】Spring Initializr 是启动 Spring Boot Projects 的一个很好的工具。我们需要做一下几步:1、登 录
46、 Spring Initializr,按照以下方式进行选择:2、选择 com.in28minutes.springboot 为组3、选择 studet-services 为组件4、选择下面的依赖项WebActuatorDevTools5、点击生 GenerateProject6、将项目导入Eclipseo文 件-导 入-现有的Maven项目18、Spring Initializr 是创建 Spring Boot Projects 的唯一方法吗?【仅供参考】Spring Initiatlizr让创建Spring Boot项目变的很容易,但是,你也可以通过设置一个maven项目并添加正确的依赖项来
47、开始一个项目。在我们的Spring课程中,我们使用两种方法来创建项目。第一种方法是 start,spring,io。另外一种方法是在项目的标题为Basic Web Application”处进行手动设置。手动设置一个maven项目这里有几个重要的步骤:1、在 Eclipse中,使用文件-新 建 Maven项目来创建一个新项目2、添加依赖项。3、添 加 maven插件。4、添 加 S p r i n g B o o t 应用程序类。到这里,准备工作已经做好!1 9、h i b e r n a t e 是如何工作的?【仅供参考】读取并解析配置文件。读取并解析映射文件,创 建 S e s s i o
48、 n F a c t o r yo打开 S e s s i o r i o创建事务。进行持久化操作。提交事务。关闭 S e s s i o n。关闭 S e s s i o n F a c t o r y o2 0、说一下M y B a t i s 的一级缓存和二级缓存?【仅供参考】一级缓存:基 于 P e r p e t u a l C a c h e 的 H a s h M a p 本地缓存,它的声明周期是和S Q L S e s s i o n 一致的,有多个S Q L S e s s i o n 或者分布式的环境中数据库操作,可能会出现脏数据。当 S e s s i o n f l u
49、 s h 或 c l o s e 之后,该 S e s s i o n 中的所有C a c h e 就将清空,默认一级缓存是开启的。二级缓存:也是基于Perp et u a l C a c h e的 Ha sh M a p 本地缓存,不同在于其存储作用域为M a p p er级别的,如果多个S Q L S essi o n之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 E h c a c h eo 默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现S eri a l i z a b l e序列化接口(可用来保存对象的状态)。开启二级缓存数据查询流程:二级缓存
50、-一级缓存-数据库。缓存更新机制:当某一个作用域(一级缓存S essi o n/二级缓存M a p p er)进行了C/U/D 操作后,默认该作用域下所有sel ec t 中的缓存将被c l ea r。四、R edi s/R a b b i t M Q/K a fk a/Z o o k eep er1、R a b b i t M Q 怎么避免消息丢失?【仅供参考】把消息持久化磁盘,保证服务器重启消息不丢失。每个集群中至少有一个物理磁盘,保证消息落入磁盘。2、要保证消息持久化成功的条件有哪些?【仅供参考】声明队列必须设置持久化du ra b l e设置为t ru e.消息推送投递模式必须设置持久