面试题(6)

第一次

1、JVM运行时数据区描述下
答:三个数据区分别是方法区/元空间、堆区、栈区;
方法区/元空间:又叫静态成员区,所有类级别数据将被存储在这里,包括静态变量。每个 JVM 只有一个方法区,可以被所有线程共享所以是线程不安全的。

堆区:所有的对象和它们相应的实例变量以及数组将被存储在这里。一个jvm也是只有一个堆,也是线程不安全。
分新生代和老生代两块区域,新生代啊又分一个伊甸区和两个幸存区,没有被回收的对象会被放在幸存区,每次回收都会有标记,如果多次回收没成功将会被放到老生代中。

栈区:虚拟机栈(运行我们的方法的),本地栈(执行java底层方法的比如带native的方法),程序计数器(存放程序运行的下一条指令,不会溢出)
执行方法的地方。对每个线程会单独创建一个运行时栈,不是共享的,因此是线程安全的。方法一行一行入栈然后出栈,也会出现栈溢出的情况比如递归没有出口。

2、静态变量与实例变量区别?
静态变量: 静态变量属于类,在内存中只有一份,在类的加载过程中,JVM 只为静态变量分配一次内存空间。
实例变量: 实例变量属于实例对象,每次创建对象,都会分配成员变量对应的内存空间。

3、String 、StringBuffer 、StringBuilder 的区别
String 对象是不可变的,每次对 String 的操作相当于生成一个新的 String 对象,而对
StringBuffer 和 StringBuilder 的操作是对对象本身的操作,因此频繁操作内容字符串不选择String,避免创建多个对象,影响系统性能。
StringBuilder是线程不安全的,单线程操作大量数据使用它。
StringBuffer线程安全,多线程操作大量数据使用它。

4、String s=new String(“xyz”); 创建了几个字符串对象?
两个对象,一个是静态存储区的“xyz”,一个是new 对象在堆上。

5、Java中应该使用什么数据类型来计算价格?
如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double类型

6、==与equals的区别
==是一个运算符 equals 是 Object 类的方法
基本类型变量比较: ==比较值是否相等,equals 不能直接用于基本数据类型的比较,需要转换为对应的包装类型。
引用类型的比较。==和 equals 都是比较栈内存中的地址是否相等 。相等为 true 否则为 false。但是通常会重写 equals 方法去实现对象内容的比较。

7、接口和抽象类的区别是什么?
普通类有的抽象类也有,而接口中只能存在抽象方法、成员变量只能是常量类型的、不能含有静态代码块以及静态方法
一个类只能继承一个抽象类,但是可以实现多个接口。

8、Java中的值传递和引用传递
基本数据类型传值,对形参的修改不会影响实参;
引用类型引用传递,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。
String, Integer, Double 等 immutable(不变的) 的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象

9、线程中sleep和wait方法的区别?
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会
给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释
放线程锁。
? wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进
入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)
后本线程才进入对象锁定池准备获得对象锁进入运行状态。

10、请写出你最常见的几个 RuntimeException?与非运行时异常的区别?
运行时异常比如空指针异常、字符串转换为数字异常、数组角标越界异常、方法不存在异常、数据类型转换异常;
非运行时异常即编译异常,比如Io异常、sql异常、以及用户自定义的异常。如果发生程序就不能编译通过。

11、浅拷贝和深拷贝区别
对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。
深拷贝会将所有都拷贝。

12、什么是Java内存泄漏,什么情况下会出现内存泄漏?
内存泄露是: 尽管对象不再被程序所使用,但垃圾回收器却无法将其回收的情况。泄露会引起内存溢出。
未关闭的流、未关闭的连接、静态类型的对象的引用也会导致 Java 内存泄漏。ThreadLocal。
13、什么是双亲委派模型?为什么要使用双亲委派模型
可以将 Java 字节码加载为 java.lang.Class 实例的工具

自下而上委托,如果没有委托了到顶了就自上而下加载,过程中有一个加载了那么就不会继续往下重复加载。一,性能,避免重复加载;二,安全性,避免核心类被修改。

第二次

1:集合类中主要有几种接口?

Collection: Collection 是集合 List、 Set、 Queue 的最基本的接口。
–Iterator:迭代器,可以通过迭代器遍历集合中的数据
–Map:是映射表的基础接口

2:List、Set、Map的区别?

–List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
–Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。
–Map(用 key 来搜索的专家): 使用键值对(key-value)存储,key 是无序的、不可重
复的,value 是无序的、可重复的,每个键最多映射到一个值。

3:集合类的底层数据结构?

–List • Arraylist:数组
• LinkedList: 双向链表
–Set • HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap来保存元素
• TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树) 
–Map
• HashMap:HashMap 由数组+链表组成的,数组是HashMap 的主体,链表则是主要为了解决哈希冲突而存在的,
如果当前数长度小于64,那么数组扩容,如果大于64且链表长度大于默认阈值8,链表转化为红黑树(减少索引时间)。

4:如何选用集合类?

–根据键值获取到元素值时就选用 Map 接口下的集合
• 需要排序时选择 TreeMap
• 不需要排序时就选择 HashMap
• 需要保证线程安全就选用 ConcurrentHashMap。
–只需要存放元素值时,就选择实现 Collection 接口的集合 + 需要保证元素
唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet + 不需要就
选择实现 List 接口的比如 ArrayList 或 LinkedList

5:HashSet如何检查重复?

加入新对象先通过哈希值确认数组位置,在相同位置下通过equals()比较是否有相等的对象,相等的话就不能加入。

6:HashMap和HashTable区别?

  1. 线程是否安全: HashMap 是非线程安全的
    Hashtable: 是线程安全的, 因为 Hashtable 内部的方法基本都经过 synchronized 修饰。
  2. 效率: 因为线程安全的问题,HashMap 要比 Hashtable 效率高一点。
    另外,Hashtable 基本被淘汰,不要在代码中使用它;
    3.hashmap键值可以为null,hashtable不可以且会报NullPointerException。

7:ConcurrentHashMap和HashTable区别?

ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不
同。
–底层数据结构:ConcurrentHashMap 底层采用数组+链表/红黑二叉树。
Hashtable 的底层数据结构采用 数组+链表 的形式
–实现线程安全的方式(重要):
① ConcurrentHashMap用 Node 数组+链表+红黑树的数据结构来实现,并发控
制使用 synchronized 和 CAS 来操作。
② Hashtable(同一把锁) :使用 synchronized来保证线程安全,效率非常低下。




8:ArrayList和LinkedList区别?
1. ```
2. 底层数据结构: Arraylist 底层是数组;LinkedList 底层是双向链表 
3. 插入和删除是否受元素位置的影响:
   –ArrayList 采用数组存储索引快,而插入和删除元素慢。 因为需要先移动到指定位置再插入。对头尾的操作快
4. 是否支持快速随机访问: LinkedList 插入和删除快,索引慢
5. 内存空间占用: ArrayList 的空 间浪费主要体现在在 list 列表的结尾会预留一
   定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗
   比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。

9:HashMap底层实现原理?

• HashMap:HashMap 由数组+链表组成的,数组是HashMap 的主体,链表则是主要为了解决哈希冲突而存在的,
如果当前数长度小于64,那么数组扩容,如果大于64且链表长度大于默认阈值8,链表转化为红黑树(减少索引时间)。

10:HashMap什么时候扩容?

*0.75,每次扩容2的n次幂(2的n次幂减少hash碰撞),0.75是考虑了时间和空间这个数合适。

11:HashMap中的key我们可以使用任何类作为key吗?

可以。
自定义类作为 HashMap 的 key,那就需要注意以下几点:
–如果类重写了 equals 方法,它也应该重写 hashCode 方法。
–类的所有实例需要遵循与 equals 和 hashCode 相关的规则。
–咱们自定义 key 类的最佳实践是使之为不可变的,这样,hashCode 值可以
被缓存起来,拥有更好的性能。不可变的类也可以确保 hashCode 和
equals 在未来不会改变,这样就会解决与可变相关的问题了。

12:HashMap的长度为什么是2的N次方呢?

每次扩容2的n次幂(2的n次幂减少hash碰撞)

13:Collection和Collections的区别?

 Collection 是集合类的上级接口, 继承与它的接口主要是 set 和 list。
 Collections 类是针对集合类的一个工具类. 它提供一系列的静态方法对各种集
合的搜索, 排序, 线程安全化等操作

14:数组(Array)和列表(ArrayList)区别?

 Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
 Array 大小是固定的,ArrayList 的大小是动态变化的。
 ArrayList 处理固定大小的基本数据类型的时候,这种方式相对比较慢。

15:BIO和NIO区别?

bio 同步阻塞 io:在此种⽅式下,⽤户进程在发起⼀个 IO 操作以后,必须等待
IO 操作的完成,只有当真正完成了 IO 操作以后,⽤户进程才能运⾏。JAVA 传
统的 IO 模型属于此种⽅式!
 nio 同步⾮阻塞式 I/O;java NIO 采⽤了双向通道进⾏数据传输,在通道上我们
可以注册我们感兴趣的事件:连接事件、读写事件;NIO 主要有三⼤核⼼部分:
Channel(通道),Buffer(缓冲区), Selector。传统 IO 基于字节流和字符流进⾏操作,
⽽NIO 基于 Channel 和 Buffer(缓冲区)进⾏操作,数据总是从通道读取到缓冲区
中,或者从缓冲区写⼊到通道中。Selector(选择区)⽤于监听多个通道的事件(⽐
如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

16:红黑树有什么特征?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kifEwqZ7-1682814225559)(C:\Users\23987\Desktop\面试题\面试题.assets\image-20230418001847434.png)]

第三次

1.创建线程有几种方式?

继承 Thread 类并重写 run 方法创建线程,实现简单但不可以继承其他类
• 实现 Runnable 接口并重写 run 方法。避免了单继承局限性,编程更加灵活,
实现解耦。
• 实现 Callable 接口并重写 call 方法,创建线程。可以获取线程执行结果的返回
值,并且可以抛出异常。
• 使用线程池创建

2.start和run的区别?

线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行
调用start方法可以启动线程,并且使得线程进入就绪状态,而run方法只是thread的一个普通方法,还是在主线程中执行。

3.为什么使用线程池,优势是什么?

1、重用存在的线程,减少线程创建和销毁的开销,提高性能(降低资源消耗)
2、提高响应速度,当任务达到时,任务可以不需要等待线程创建就能立即执行(提高响应速度) 
3、提高线程的可管理性,统一对线程进行分配、调优和监控(增强可管理性)

4.线程池重要参数有哪些?

核心线程数、最大线程数、临时线程存活时间、存活时间单位、等候队列、线程工厂、拒绝策略

5.线程池工作原理?

先让核心线程去执行程序,满了就进入等候队列,满了就创建临时线程,也满了就拒绝策略。

6.线程池的拒绝策略有哪些?

1.默认是丢弃任务抛出RejectedExecutionException异常,打断当前执行流程。
2.只要线程池没有关闭,就由提交任务的当前线程(主线程)处理。
3.直接静悄悄的丢弃这个任务,不触发任何动作
4.丢弃队列最前面的任务,重新提交被拒绝的任务

7.线程池内抛出异常,线程池会怎么办?

会把异常的线程移除并销毁,同时创建一个新的线程加入线程池中。

8.线程池在实际项目中的使用场景?

线程池一般用于同时执行多个没有相关联的耗时任务

9.synchronized和lock的区别?

存在层面:Syncronized 是 Java 中的一个关键字,存在于 JVM 层面,Lock 是Java 中的一个接口
Syncronized可以写在方法上面也可以写在具体代码块上,执行完同步代码后或异常自动释放。lock可以锁在代码的前面,解锁要写在finally,不然容易造成线程死锁。
Syncronized 需要等待释放锁,然后通过竞争到锁才能进去执行代码。
lock中有尝试获取锁的代码,如果尝试获取到锁,则不用一直等待。
Synchronized 无法判断锁的状态,Lock 则可以判断
• 锁的类型:Synchronized 是可重入,不可中断,非公平锁;Lock 锁则是 可重入,可判断,可公平锁
• 锁的性能:Synchronized 适用于少量同步的情况下,性能开销比较大。Lock 锁适用于大量同步阶段:可以提高多个线程进行读的效率

10.Java中有哪些锁?

悲观锁:认为自己在使用数据的时候会有别的线程来修改数据,所以先锁起来,确保不被修改。synchronized和lock
乐观锁:采用cas(compareAndSwap)实现,是一种更新的原子操作,比较当
前值跟传入值是否一样,一样则更新,否则返回 false,不进行任何操作;例如
ActomicInteger 类的原子自增是通过 CAS 自选实现。
可以是版本号控制,数据表加版本字段,每次修改数据版本+1,提交必须满足“ 提交版本必须大于记录当前版本才能执行更新
自旋锁:也是用到了CAS机制
无锁:表面上没有加锁,是乐观锁,CAS机制
轻量级锁:乐观锁
重量级锁:锁资源,synchronized和lock
分段锁:ConcurrentHashMap利用了HashMap的数组结构,应用场景:一个方法中涉及到多个锁定资源的情况。

第四次

1.了解TCP三次握手四次挥手吗

客户端与服务端之间通过三次握手建立可靠连接,四次挥手断开保证数据不丢失。
第一次握手客户端告诉服务端我能正常发送数据,第二次握手服务端告诉客户端我能接收发送数据,第三次握手客户端告诉服务端我能接收数据
四次挥手:客户端告诉服务端要断开连接,服务端让客户端等等,处理自己的数据,好了告诉客户端完毕,客户端收到告诉服务端断开连接

2.Get和Post的区别?

1. Get是不安全的,因为在传输过程,数据被放在请求的URL中;受到url长度限制传输数据不超过1-18k(浏览器不同限制不同)
2.Post的所有操作对用户来说都是不可见的,所以是安全的,传输数据放在请求体一般长度不受限制。         
3. Get限制Form表单的数据集的值必须为ASCII字符;而Post没有限制。                   
4. Get执行效率比Post方法好。Get是form表单提交的默认方法。 

3.HTTP中重定向和请求转发的区别

转发是服务器行为
重定向是客户端行为
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,不可以携带数据
请求转发特点:一次请求,浏览器地址不变,访问的是自己本身的 web 资源,可以携带数据。

4.在浏览器中输入url地址到显示主页的过程

1、域名解析
2、发起 TCP 的三次握手
3、建立 TCP 连接后发起 http 请求
4、服务器响应 http 请求
5.浏览器得到并解析 html 代码、请求 html 代码中的资源、对页面进行渲染呈现给用户
6、连接结束

5.Cookie和Session的区别

cookie:数据信息存放在客户端浏览器上,不占用服务器内存,容量<=4kb一个站点20-50个Cookie,不安全对客户端可见,可以设置cookie的有效时间。
session:数据信息存放在服务器上,是安全的,存储容量无上限,但为了服务器性能不会放过多东西,并设置session删除机制或者采用缓存技术代替session。
可以存储任何类型的数据,依赖于jsession的cookie,默认失效时间-1,关闭窗口就会失效。每个用户都会产生一个session,用户量大的话耗费大量的内存。

6.如何解决分布式Session

Nginx ip_hash 策略 ,同个ip固定访问一个服务器,避免跨服session失效问题。
Session复制,任何一个服务器上的 Session发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。
用jwt令牌技术替换session.

7.Tomcat 如何进行内存调优

设置内存在catalina.sh中,调整JAVA_OPTS变量,把里面的最大可用内存以及初始内存都设置1024M,以避免每次垃圾回收完成后 JVM 重新分配内存。

8.过滤器和拦截器的区别

过滤器基于回调实现,而拦截器基于动态代理。
拦截器对访问控制的粒度更细。
拦截器往往用于权限检查、日志记录等,过滤器主要用于过滤请求中无效参数,安全校验。
过滤器依赖于 Servlet 容器,局限于 web,而拦截器依赖于 Spring框架,能够使用 Spring 框架的资源,不仅限于 web。
过滤器在 Servlet 前后执行,拦截器在 handler 前后执行

9.常见的WEB漏洞有哪些?如何解决

sql注入,采用预编译解决,先用占位符,然后传入的值作为参数的整体放进去,不影响原来的sql。

第五次

第五次:
题目1:谈谈你对Spring的理解?

spring有两大核心分别是IOC和AOP
IOC:控制反转将创建对象的权力交给IOC容器,由IOC容器帮我们创建对象
AOP:面向切面编程,在不改变源代码的基础上对原始方法进行增强

题目2:SpringBean的生命周期?

创建对象
属性赋值
执行初始化方法init()
如果需要被代理,生成代理对象也就是aop
最终生成的bean,存到单例池中。

题目3:IOC的优点?

IOC:控制反转,是将创建对象的权力交给IOC容器管理,这样做可以简化开发,解耦性更好。IOC容器加载服务时支持饿汉式和懒加载

题目4:IOC中Bean有几种注入方式?

三种:
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
Setter 方法注入::Setter方法注入是容器通过调用无参构造器或无参 static 工厂方法实例化 bean 之后,调用该 bean 的 Setter 方法
@Bean注解注入

题目5:SpringBean有几种配置方式?就是注入容器

有xml配置方式这种基本不用了。
注解声明配置方式,比如@Component,基本都使用注解方式
通过配置类扫包的方式以及方法上加@Bean

题目6:AOP的代理有几种方式(AOP的实现原理)?

AOP思想的实现是基于动态代理,Java中一般采用jdk动态代理模式,jdk动态代理只能代理接口,不能代理类。因此,如果目标对象的实现类是接口,采用jdk动态代理。如果目标对象的实现类没有实现接口,AOP采用CGLIB来生成AOP动态代理类。

题目7:AOP主要用在哪些场景中?

事务管理
日志
性能监视
安全检测
缓存

题目8:SpringBean的作用域有几种?

有5种:
singleton 单例模式:容器启动的时候创建一次
propotype:多例模式:每创建一次对象都会创建一个实例
request:每次请求都会生成一个新的bean,该bean只在这次请求中有效
session:每次请求都会创建一个新的bean,该bean只在当前session有效
globl-session:全局session作用域

题目9:Spring框架中的单例bean是线程安全的吗?

不是线程安全的,例如当多个线程同时操作同一个对象的时候,对这个非静态的成员变量进行了修改,会存在线程安全问题
解决方法:将需要的可变的成员变量存放在ThreadLocal中。

题目10:Spring事务传播行为有几种?
7种:记住前面两种

**① PROPAGATION_REQUIRED:当前有事务就加入,没事务就创建事务,总之必须要有事务,该设置是最常用的。**
**② PROPAGATION_SUPPORTS:支持当前事务,有事务加入事务,没事务,就以非事务执行。**
**③ PROPAGATION_MANDATORY:支持当前事务,有事务加入事务,没事物,就抛出异常。**
**④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。**
**⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。**
**⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。**
**⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。**

题目11:Spring中的事务隔离级别?

**① ISOLATION_DEFAULT:使用数据库设置的隔离级别,数据库设置的是什么就用什么。
**② ISOLATION_READ_UNCOMMITTED:读未提交,允许其他事务可以看到这个事务未提交的数据。**
**③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被其他事务读取,而且能看到该事务对已有记录的更新。解决脏读问题**
**④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。行锁**
**⑤ ISOLATION_SERIALIZABLE:可串行化:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。表锁**

题目12:Spring的通知是什么?有哪几种类型?

通知是在切点前后要执行的动作
前置通知,后置通知,最终通知,异常通知,环绕通知(包含前面四种通知)

题目13:Spring中的设计模式有哪些?

工厂模式,单例模式,代理模式,模板模式,监听者模式

题目14:Spring的常用注解有哪些?

@Controller。@Bean。@Configuration。@import。
@service @mapper @component @Autowired ,@Resource

题目15:@Resources和@Autowired的区别?

@ Resource是先根据参数名称找到容器的Bean对象,没有找到名称就根据类型找,是jdk提供的
@Autowired根据类型找,而且必须要求对象存在,spring提供的

第六次

1:@Component和@Bean的区别?

@Component 注解作用于类,而@Bean 注解作用于方法。
• @Component 注解通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中。
@Bean 注解通常是在标有该注解的方法中定义产生这个bean,告诉 Spring 这是某个类的实例,当我需要用它的时候还给我。
• @Bean 注解比@Component 注解的自定义性更强,而且很多地方只能通过
@Bean 注解来 注册 bean。比如当引用第三方库的类需要装配到 Spring 容器的时候,就只能通过@Bean 注解来实现。

2:Spring是怎么解决循环依赖的?

spring依靠三级缓存来解决循环依赖。如果中间有动态代理对象,那么在一方注入时添加@lazy懒加载来解决
一级缓存:单例对象
二级缓存:刚实例化并未赋值的对象
三级缓存:创建对象的工厂

3:SpringMVC执行流程(工作原理)?

一个核心:DispatcherServlet前端控制器
三大组件:HandleMapping处理器映射器、HandleAdapter处理器适配器、ViewResolver视图解析器
浏览器请求发过来,前端控制器接收到路径后给到处理器映射器,其根据路径找到对应的method对象,
然后将method交给控制器适配器解析执行,
判断是否是同步,是的话就传递到视图解析器返回整个页面,不是的话直接返回json数据。

4:SpringMVC的常用组件(三大组件)有哪些?

一个核心:DispatcherServlet前端控制器
三大组件:HandleMapping处理器映射器、HandleAdapter处理器适配器、ViewResolver视图解析器

5:SpringMVC的常用注解有哪些?

Configuration:注解配置类
ComponentScan扫包
EnableWebMVC:json数据类型自动转换(这只是一部分功能),放在配置类上,
RequestMapping:放请求路径的
RequestBody:注解json请求参数的
RequestParam:注解简单类型的集合参数和给参数取别名
ResponseBody:响应json格式数据(异步请求)
RestController:等于ResponseBody和Controller注解
DateTimeFormat:注解在日期参数前,设置时间日期格式

6:SpringMVC如何处理统一异常?

在类上加注解(@ControllerAdvice)表明这是一个全局异常处理类
在方法上加注解 (@ExceptionHandler), 在 ExceptionHandler 中 有 一 个 value 属性, 指定可以处理的异常类型

7:MyBatis中#{}和${}的区别是什么?

#{}是预编译处理(先占位,然后整体作为一个参数),${}是字符串替换(会作为sql的一部分执行)。

8:MyBatis中当实体类中的属性名和表中的字段名不一样如何解决??

使用 resultMap,映射实体类属性名字和数据表字段名字

9:MyBatis是如何进行分页的?分页插件的原理是什么?

PageHelper插件,执行select查询时,拼接limit
和count,一共执行两条sql

10:MyBatis动态SQL了解吗?

1. **<if>if是为了判断传入的值是否符合某种规则,比如是否不为空.**
2. **<where> where**标签可以用来做动态拼接查询条件,当和if标签配合的时候,不用显示的声明类型where 1 = 1这种无用的条件
3. **<foreach> foreach**标签可以把传入的**集合对象进行遍历,然后把每一项的内容作为参数传到sql**语句中.
4. <includ**e> include**可以把大量的重复代码整理起来,当使用的时候直接include即可**,减少重复代码的编写**;
5. <set>**适用于更新中**,当匹配某个条件后,才会对该字段进行跟新操作

11:MyBatis一级缓存和二级缓存?

一级缓存作用在同一个sqlSession中,自动生成,增删改提交关闭会清除缓存
二级缓存作用在同一个mapper中,配置xml打开二级缓存,第二步配置mapper的xml以及对应的类实现序列化接口

12:ResultType和ResultMap的区别?

如果数据库结果集中的列名和要封装实体的属性名完全一致的话用 resultType 属性,如果不一致的话用 resultMap 属性。
通过resultMap手动建立对象关系映射,用resultMap配置表和类的一一对应关系,所以字段名和实体类的属性名不一样也没关系,都会映射出来。

13:MyBatis中有哪些设计模式?

Builder 模式,例如 SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
• 工厂模式,例如 SqlSessionFactory、ObjectFactory、MapperProxyFactory;
• 单例模式,例如 ErrorContext 和 LogFactory;
• 代理模式,Mybatis 实现的核心,比如 MapperProxy、ConnectionLogger,用的 jdk
的动态代理;还有 executor.loader 包使用了 cglib 或者 javassist 达到延迟加载的
效果;
• 组合模式,例如 SqlNode 和各个子类 ChooseSqlNode 等;
• 模板方法模式,例如 BaseExecutor 和 SimpleExecutor,还有 BaseTypeHandler 和
所有的子类例如 IntegerTypeHandler;
• 适配器模式,例如 Log 的 Mybatis 接口和它对 jdbc、log4j 等各种日志框架的适
配实现;
• 装饰者模式,例如 Cache 包中的 cache.decorators 子包中等各个装饰者的实现;
• 迭代器模式,例如迭代器模式 PropertyTokenizer;

第七次

题目1:为什么用SpringBoot(优点)?

简化编码,简化配置,简化部署,简化监控,
简化依赖坐标导入,简化整合其他技术

题目2:SpringBoot、Spring MVC和Spring有什么区别?

• Spring  最重要的特征是依赖注入。当我们恰当的使用 DI 或者是 IOC 的时候,可以开发松耦合应用。
• Spring MVC提供了一种分离式的方法来开发 Web 应用。通过组件开发Web 应用将会变的非常简单。
• SpringBoot Spring 和 Spring MVC 的问题在于需要配置大量的参数。 SpringBoot通过一个自动配置和启动的项来解决这个问题。

题目3:SpringBoot自动配置原理?

依靠@EnableAutoConfiguration内部的@Import注解,导入AutoConfigurationImportSelector类,里面的selectImports方法扫描导入的
所有jar包里的spring.factories文件并解析文件中自动配置类key=value的形式,将列表中的类加载到spring容器中。

题目4:运行SpringBoot有哪几种方式?

• 打包用命令或者放到容器中运行
• 用 Maven/ Gradle 插件运行
• 直接执行 main 方法运行

题目5:SpringBoot的核心注解是哪个?由哪些注解组成?

SpringBootApplication,由 3 个注解组成:
• @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
• @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能。
• @ComponentScan:Spring 组件扫描。

题目6:SpringBoot常用的starter有哪些?

spring-boot-starter: 核心启动器,包括自动配置支持,日志记录和 YAML
• spring-boot-starter-web (嵌入 tomcat 和 web 开发需要 servlet 与 jsp 支持) 
• spring-boot-starter-test - 单元测试和集成测试;
• spring-boot-starter-jdbc - 传统的 JDBC;
• spring-boot-starter-security - 使用 SpringSecurity 进行身份验证和授权;
• spring-boot-starter-data-jpa (数据库支持) 
• spring-boot-starter-data-redis (redis 数据库支持) • spring-boot-starter-data-amqp (MQ 支持) 
• mybatis-spring-boot-starter (第三方的 mybatis 集成 starter)

题目7:bootstrap.yml和application.yml 有何区别?

• bootstrap.yml优先级比application.yml高,一般用于配置中心。
• application.yml,用于 SpringBoot项目的自动化配置。

题目8:SpringBoot配置文件加载顺序? applicaiton.properties application.yml

applicaiton.properties 》application.yml》application.yaml

题目9:SpringBoot读取配置文件内容的方式有几种?

1. 使用 @Value 注解直接注入对应的值,这能获取到 Spring 中
Environment 的值;
b) 使用 @ConfigurationProperties 注解把对应的值绑定到一个对象;
c) 直接获取注入 Environment 进行获取;
4. @Value PropertySource 和@Value 配合使用(注意不支持操作 yml 格式
配置文件)

题目10:SpringBoot支持哪些日志框架?默认的日志框架是哪个?

Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用
Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架

题目11:SpringBoot打成的jar和普通的jar有什么区别?

SpringBoot打成的jar是可以部署运行的项目
普通的jar不可以,里面确实很多东西,比如依赖包

题目12:为什么我们需要spring-boot-maven-plugin?

pring-boot-maven-plugin是spring boot提供的maven打包插件。可打直接可运行的jar包或war包。
build-info:生成项目的构建信息文件 build-info.properties
help:用于展示spring-boot-maven-plugin的帮助信息。使用命令行mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name>可展示goal的参数描述信息。
repackage:可生成可执行的jar包或war包。插件的核心goal。
run:运行 Spring Boot 应用
start:在集成测试阶段,控制生命周期
stop:在集成测试阶段,控制生命周期

题目13:如何监视所有Spring Boot微服务? springBootAdmin

Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用
程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很
有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序
的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理
员将不得不击中所有 50 个应用程序的执行终端。为了帮助我们处理这种情况,我
们将使用 Spring Boot Admin 开源项目。它建立在 Spring Boot Actuator 之上,它提
供了一个 Web UI,使我们能够可视化多个应用程序的度量。

题目14:SpringBoot开发服务会遇到哪些问题? springboot的弊端

将现有或传统的Spring Framework项目转换为Spring Boot应用程序是一个非常困难和耗时的过程。它仅适用于全新Spring项目。
集成度很高,对于了解底层不容易。

第八次

1、微服务的优缺点是什么?用微服务会遇到哪些问题

优点:松耦合,聚焦单一业务功能,无关开发语言,降低团队规模。在开发中,
不需要了解多的业务,只专注于当前功能,便利集中,功能小而精。微服务一个功能受损,
对其他功能影响并不是太大,可以快速定位问题。可以灵活搭配技术,高度自治。
• 缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,系统依赖增强

2、为什么用SpringCloud (优点)

为了解决单体结构应用带来的问题,包括代码结构混乱、代码冲突影响开发效率、排查解决问题成本高。
springcloud高度解耦,很大程度上解决以上问题。

3、SpringCloud和SpringBoot 的区别和关系

Spring Boot 专注于快速,方便的开发单个微服务个体。 
SpringCloud 关注全局的服务治理框架,Springcluod是高度依赖于springboot的。

4、SpringCloud由哪些组件组成

注册中心: Eureka(ZooKeeper)
作用:客户端将服务的信息注册到Eureka服务端中,而服务相当于一个注册中心,里面有注册表,其中保存了各个服务所在的ip和端口,服务间可以由此发现和调用实现跨服通讯。

服务远程调用:Feign (Dubbo)
作用:用于服务间的调用。通过@FeignClient注解接口,Feign就会针对这个接口创建一个动态代理,我们调用这个接口即可调用到这个动态代理,Feign的动态代理会根据你在接口上的RequestMapping等注解来动态构造出你要请求的服务地址。最后针对这个地址发送请求跟解析响应。

负载均衡:Ribbon
作用:用于调用服务的时候部署多台服务器的情况,需要做负载均衡,默认采用轮询算法,而默认实现采用的是

配置中心:Spring Cloud Config/nacos
作用:将一些需要热更新的微服务配置信息在配置中心,基本不会变更的一些配置还是保存在微服务本地比较好。

服务网关:SpirngCloudGateway,Zuul
作用:微服务的入口,需要校验用户是否有请求资格,没有则拦截。
一切请求都必须先经过网关,但网关不处理业务,而是把请求转发到某个微服务,这个过程称为路由。当路由目标为多个服务时,需要做负载均衡。
当请求流量过高时,在网关中按照下流的微服务能够接收的速度来放行请求,避免服务压力过大。

服务监控和保护: Hystrix (Sentinel)
作用:Hystrix是隔离、熔断以及降级的一个框架,说白了就是Hystrix会搞很多小线程然后让这些小线程去请求服务返回结果。Hystrix相当于是个中间过滤器,如果服务宕机了,那我们请求该服务就直接返回,不需要等待超时结束抛异常。这就是熔断。


5、Eureka工作原理

•客户端将服务的信息注册到Eureka服务端中,而服务端相当于一个注册中心,里面有注册表,其中保存了各个服务所在的ip和端口,服务间可以由此发现和调用实现跨服通讯。
• 心跳(续约):提供者定期通过 http 方式向 Eureka 刷新自己的状态(每 30s 定时向 EurekaServer 发起请求)

6、什么是服务熔断?什么是服务降级

熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。
在SpringCloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。
服务降级,一般是从整体负荷考虑,当整体资源不足的时候,适当放弃部分(服务延迟使用或暂停使用),保证核心服务的资源稳定。
就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的 fallback 回调,返回一个缺省值

7、什么是服务雪崩效应

雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服
务也会发生宕机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可
用逐步扩大到各个其他服务中,从而使整个项目的服务宕机崩溃

8、微服务之间如何通讯,用的是哪种协议

同步通信:比如feign远程调用,基于hettp协议通讯,可以返回结果
• 异步通信:消息队列,如:RabbitMq、ActiveM、Kafka 等。不能返回结果

9、HashMap底层实现原理?

HashMap:HashMap 由数组+链表组成的,数组是HashMap 的主体,链表则是主要为了解决哈希冲突而存在的,
如果当前数长度小于64,那么数组扩容,如果大于64且链表长度大于默认阈值8,链表转化为红黑树(减少索引时间)。
链表长度小于6的时候就取消红黑树

10、HashMap什么时候扩容?

不设置HashMap长度的话,默认是16*0.75=12,超过12就扩容一倍32。
扩容重新编排元素位置,消耗性能,所以我们在预知长度的时候给设置好长度,设置2的倍数,因为扩容都是按2倍数增长。
设置长度的时候应该让长度*0.75>已知长度,也就是长度=已知长度/0.75,然后取2的倍数。比如1000那么设置2048,因为1024*0.75<1000
所以再取2的倍数就是2048。

第九次

1、数据库三大范式

第⼀范式:1NF 原⼦性,列或者字段不能再分
第⼆范式:2NF 唯⼀性要求记录有惟⼀标识;
第三范式:3NF 每个属性都跟主键有直接关系, ⽽不是间接关系。

2、数据库事务ACID特性

**原子性**:即不可分割性,事务要么全部被执行,要么就全部不被执行。 
**一致性**:事务的执行使得数据库从一种正确状态转换成另一种正确状态
**隔离性**:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务, 
**持久性**:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。 

3、并发事务带来的问题

脏读(Dirty read): 一个事务访问数据并进行修改,但未提交,另一个事务读到了修改未提交的数据,
而对这个数据的操作可能是不是正确的,这就是脏数据。

• 丢失修改(Lost to modify): 两个事务同时对一个数据访问并修改,而最终结果只有一个修改成功,另一个修改成为丢失修改。
比如数据读到的是20,对其修改之后是19,但两次修改应该是18,所以丢失了一个修改。

• 不可重复读(Unrepeatableread): 一个事务内多次读取同一数据,事务未结束但其他事务对这个数据修改,
那么同一事务的多次读取数据结果就会不同。这就是不可重复读。

• 幻读(Phantom read): 幻读与不可重复读类似。一个事务读取了几行数据,另一个事务插入了一些数据,
事务再去读取同几行数据就会结果不同,跟幻觉一样。

4、数据库事务隔离级别

• READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数
据变更,可能会导致脏读、幻读或不可重复读。
• READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻
止脏读,但是幻读或不可重复读仍有可能发生。
• REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非
数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
• SERIALIZABLE(可串行化): 最高的隔离级别,完全服从 ACID 的隔离级别。所有
的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级
别可以防止脏读、不可重复读以及幻读。

5、MySQL存储引擎对比

mysql默认使用InnoDB:支持事务和外键,适合比较庞大的应用场景
还有一个MyISAM:不支持事务和外键,但是访问速度快,如果多次访问的表可以考虑使用这个。

6、drop 、delete与truncate区别

truncate 和不带 where 子句的 delete、以及 drop 都会删除表内的数据,但是
truncate 和 delete 只删除数据不删除表的结构(定义),执行 drop 语句,此表的结
构也会删除,也就是执行 drop 之后对应的表不复存在。
速度,一般来说: drop> truncate >delete

7、索引的类型?

主键索引、唯一索引、普通索引、联合索引
经常用什么条件查询,那么就给什么字段添加索引,如果多个字段,那么就创建联合索引(最左原则问题,违反的话就会索引失效)
执行计划:判断是否使用索引,查询sql前面+explain,结果中如果type是all,那么就不走索引
聚簇(把查询数据放到内存),非聚簇,把数据磁盘地址放在内存。

8、列值为 NULL 时,查询是否会用到索引

9、什么情况索引会失效?

有运算就失效、模糊查询前面+%失效,数据类型不匹配的时候、违背最左原则

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

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
• 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
行锁乐观锁+版本号,表锁悲观锁

11、ES为什么这么快(什么是倒排索引)?

因为使用倒排索引:把模糊查询的字段分词作为索引,然后根据词条索引拿到对应的id,再通过id拿数据。所以快。

12、ES中query和 filter 的区别?

• query:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;
• filter:查询操作仅判断是否满足查询条件,不会计算任何分值,也不会关心返回的排序问题,
同时,filter 查询的结果可以被缓存,提高性能。

第十次

1、mysql在创建索引时应该注意什么,什么情况下不推荐创建索引?

注意:尽量选择不要索引null的字段。、
不推荐:表数据比较少的时候,识别度低比如性别,表中数据经常改变

2、MySQL问题排查都有哪些手段?

开启查询慢日志(定位哪个sql执行时间慢,默认10秒,自己定义低于10秒为佳,超过这个超时时间那么就会把这条sql记录到日志),explain执行计划type是all那么就是没走索引,如果连表查询,可以用冗余字段提高查询效率避免连表

3、MySQL主从复制流程是怎样的

需要开启,记住binlog日志
• Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到
slave。
• Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log 。
• Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行。
• 如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的
真正的多线程复制, SQL 线程只做 coordinator ,只负责把 relay log 中的
binlog 读出来然后交给 worker 线程,woker 线程负责具体 binlog event 的执
行。

4、MySQL的redolog、undolog、binlog都是干什么的?

seata的at模式快照的undolog,redolog事务提交的时候宕机了,会记录到redolog,
binlog用于主从复制的

5、UNION与UNION ALL

UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中,MySQL 会把
结果集中 重复的记录删掉,而使用 UNION ALL,MySQL 会把所有的记录返回,且
效率高于 UNION 。

在这里插入图片描述

6、MySQL读写分离的实现方案

使用主从复制,sharding-jdbc
sharding-sphere 是强大的读写分离、分表分库中间件,sharding-jdbc 是
sharding-sphere 的核心模块。

7、MySQL优化方案有哪些

 表设计优化(字段长度控制、添加必要的索引)
 SQL 优化(避免 SQL 命中不到索引的情况)
 架构部署优化(一主多从集群部署)
 编码优化实现读写分离

8、数据库连接池技术有哪些?你们用的是哪一个

默认不写就是用hikari,可以使用druid.

9、百万数据怎么快速查询出一条数据

1.加索引
2.分库分表
3.es

10、SQL内连接外连接有什么差别

内连接:内连接 li(inner join)就是 join)利用 where 子句对多表连接形成的笛卡尔积
进行筛选。说白了内连接就是获取两个表之间的公共部分内容。
左外连接 left join:如果要获取左边表中的全部内容,就使用左连接
右连接 right join:如果要获取右边表的全部内容,就使用右连接。

11、说一下你们项目的登录流程

第十一次

1、MongoDB的优势有哪些
2、MongoDB与MySQL的区别是什么
3、哪些场景下会选择Kafka
4、Kafka架构包含哪些内容
5、Kafka分区的目的
6、Kafka是如何做到消息的有序性
7、Kafka中consumer group是什么概念
8、Kafka消息丢失和重复消费怎么处理
9、解释下Kafka中偏移量(offset) 的是什么
5、UNION与UNION ALL

UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中,MySQL 会把
结果集中 重复的记录删掉,而使用 UNION ALL,MySQL 会把所有的记录返回,且
效率高于 UNION 。

[外链图片转存中…(img-vv1MwOoi-1682814225560)]

6、MySQL读写分离的实现方案

使用主从复制,sharding-jdbc
sharding-sphere 是强大的读写分离、分表分库中间件,sharding-jdbc 是
sharding-sphere 的核心模块。

7、MySQL优化方案有哪些

 表设计优化(字段长度控制、添加必要的索引)
 SQL 优化(避免 SQL 命中不到索引的情况)
 架构部署优化(一主多从集群部署)
 编码优化实现读写分离

8、数据库连接池技术有哪些?你们用的是哪一个

默认不写就是用hikari,可以使用druid.

9、百万数据怎么快速查询出一条数据

1.加索引
2.分库分表
3.es

10、SQL内连接外连接有什么差别

内连接:内连接 li(inner join)就是 join)利用 where 子句对多表连接形成的笛卡尔积
进行筛选。说白了内连接就是获取两个表之间的公共部分内容。
左外连接 left join:如果要获取左边表中的全部内容,就使用左连接
右连接 right join:如果要获取右边表的全部内容,就使用右连接。

11、说一下你们项目的登录流程

[外链图片转存中…(img-JGiRiWNd-1682814225560)]

12、自媒体文章审核的具体做法

[外链图片转存中…(img-Mq8qVUKB-1682814225560)]

向app文章中插入数据

第十一次

1、MongoDB的优势有哪些
2、MongoDB与MySQL的区别是什么
3、哪些场景下会选择Kafka
4、Kafka架构包含哪些内容
5、Kafka分区的目的
6、Kafka是如何做到消息的有序性
7、Kafka中consumer group是什么概念
8、Kafka消息丢失和重复消费怎么处理
9、解释下Kafka中偏移量(offset) 的是什么
10、Kafka什么时候会触发 Rebalance

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dl机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值