首页 > 编程语言 >Java 2025年面试总结(持续更新)

Java 2025年面试总结(持续更新)

时间:2024-12-06 15:29:06浏览次数:6  
标签:Java 面试 Spring 数据库 Kafka 2025 实例 参数 可以

1.自我介绍简单一点吧,把自己的情况说清楚,一两分钟即可。

2.微服务的组件
答:微服务是把一个类似单体项目根据某种维度进行拆分,比如根据功能模块进行拆分。
拆分之后,具备了更好的抗压性/扩展性,还可以更好的解耦,但是维护相比之前会更麻烦了
常用的组件有Spring Cloud。其中里面有:
Nacos:用来做注册中心/配置中心
Gateway:用来做网关
Hystrx:做限流、熔断、降级
Dubbo:做服务间的调用
Feign:也是服务间的调用

3.mq的运用
答:本项目中是用作削峰和解耦。

4.项目的并发

5.机器搭建

6.团队的规模

 7.查询优化

答:索引

8.spring的知识点

9.@resource/@Autowired区别

答:(1)来源不一样:@Autowired 是 Spring 定义的注解,而 @Resource 是 Java 定义的注解
(2)依赖查找的顺序不同:依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中,
@Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找
@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找
(3)支持的参数不同:@Autowired 和 @Resource 在使用时都可以设置参数,其中 @Autowired 只支持设置一个 required 的参数,而 @Resource 支持 7 个参数
(4)依赖注入的用法不同:@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入
(5)编译器 IDEA 的提示不同:@Autowired 编译器会提示报错信息

10.设计模式

答:单例模式、设配器模式、工厂模式、代理模式

11.单例模式如何避免线程安全以及应用场景

答:

单例模式在多线程的,应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,
那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。

解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。

应用场景:对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等

12.设计模式里面的工程模式?

答:(1)简单工厂模式:建立一个工厂类,对实现了同一接口的一些类进行实例的创建。优点是比较好理解,简单易操作。
缺点是类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改
(2) 工厂方法模式:对简单工厂模式的改进,使用一个工厂接口,创建多个工厂类,每个工厂创建对应的对象。
创建一个工厂接口和创建多个工厂实现类,一旦需要增加新的功能,直接增加新的工厂类就可以了,
不需要修改之前的代码。有利于代码的维护和扩展。
(3) 抽象工厂模式:
MyBatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式。

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

(笔记渠道/点击)

13.代码review工作的重点

答:(1)代码规范:命名、格式、内容、位置(包结构)
(2)耦合、性能、内存

13.sql xml语句(实体字段和数据库怎么对应?)

14.修改表结构语句(mysql中change和modify 的区别)

答:ALTER TABLE `ry-cloud`.sys_user_role CHANGE role_id role_id1 bigint(20) NOT NULL COMMENT '角色ID';
(1)change 可以更改列名 和 列类型 (每次都要把新列名和旧列名写上, 即使两个列名没有更改,只是改了类型)
(2)modify 只能更改列属性 只需要写一次列名, 比change 省事点
 

15.数据库mvcc(多版本解决的是读写并发冲突)

答:是数据库的多版本并发控制,在读取数据不用加锁也可以提高读取效率和并发性的手段。
实现原理:一种读取操作, 使用数据在某个时间点的快照显示查询结果, 而不考虑同时运行的其他事务所执行的更改. 
如果查询的数据已被另一个事务更改, 则会根据undo log的内容重建原始数据. 该技术避免了一些锁定问题,这些问题可以通过强制事务等待其他事务完成来减少并发性.
隐含字段:一个事务最新id,回滚的指针

16.不用or,会导致索引失效,如何改造?

答:(1)代码层面查两次
(2)或者用UNION来代替

17.数据库视图、序列化、存储过程

答:(1)数据库视图:数据库一个或多个表导出的虚拟表,方便用户对数据进行操作。视图的数据依赖原数据,二者会互相影响。
(2)数据库序列化:是将数据结构或者对象转换成字节流、json等方便去存储或者是传输。
(3)

18.数据库的事务

19.分库分表

答:关系型数据库容易成为系统瓶颈,链接数量,存储容量都是有限的,超过1千万之后因其查询维度的较多,性能会下降严重。
(1)垂直切分:分库:根据业务不同拆成不同库;分表:把不常用的字段或者长度比较大的字段拆到另一张表(主键跟着走)。缺点:只能在代码里面去聚合,增加了其复杂度
(2)水平切分:库内分表、分库分表。将按照不同的条件分散到多个数据库或者多个表中,使单表数据量变小。缺点:维护难度加大、跨分片的事务不好保证

20.事务不生效的原因

答:(1)方法不是public;(2)异常被方法吞掉了;(3)抛出异常类型大于@Transactional 默认回滚的是 RuntimeException 和 Error;(4)非同一个线程

21.jdk 1.8的新特性

答:Lambda表达式、Stream API、map数据结构优化

22.java8函数式接口,Functional Interface

答:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。为lambda表达式和方法引用(用冒号::来进行方法的调用)提供目标类型

23.spring的知识点

24.aop底层

答:面向切面的编程,通过预编译和运行期间动态代理实现程序功能统一的技术。实现invocationHandle类则是JDK动态代理,否则是CGLib动态代理。

25.SpringCloud会出现那些安全问题

26..SpringBoot监听器

27.SpringBoot的优势以及创建方式

答:(1)主要是简化新spring应用的初始搭建和开发过程(使用IntelliJ IDEA,可以利用创建Spring Initializr的方式创建Spring Boot项目、
使用官方文档创建项目,在Spring官方文档上面提供了一种在线生成Spring Boot项目的方式、
使用Spring Tool Suite,可以直接新建Spring Starter Project项目)
(2)嵌入式Web容器、自动化配置、可执行Jar部署

28.SpringCloud的配置文件

答:nacos或者阿波罗都可以。

29.springMVC(Model(模型)、View(视图)、Controller(控制器))

答:是一种软件设计规范,将业务逻辑、数据、显示分离的方法来组织代码,降低了视图和业务逻辑之间的耦合。
浏览器把请求放到试图层===控制器收到请求====模型处理数据=====返回视图===响应给浏览器

30.map的实现类

答:HashMap、TreeMap、

31.流的并行和串行

答:串行:Stream,并行:parallelStream(其底层使用Fork/Join框架实现,通过Fork把任务拆开,Join把结果进行合并)

32.环境切换(idea的设置)
答:spring.profiles.active====》VM options两处改动

33.Java中的值传递和引用传递

答:(1)值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;
(2)引用传递(pass by reference):在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;
个人认为:在一个类中调用其他方法,这个方法中如果是直接复制对象则是值传递,如果是在参数基础上改则是引用传递


34.反射应用场景

答:(1)可以动态的加载类,并创建其实例。String className = "com.example.MyClass";
Class<?> clazz = Class.forName(className);
Object obj = clazz.newInstance();
 (2)通过反射,我们可以在运行时动态地获取类的信息。这样就可以获取类的构造方法、字段、方法等信息,并进行相应的操作。

35.异常处理,finaly里面的执行

答:(1)不管try中是否出现异常,finally块中的代码都会执行;
(2)当try和catch中有return时,finally依然会执行;
(3)finally中如果包含return,那么程序将在这里返回,而不是try或catch中的return返回,返回值就不是try或catch中保存的返回值了

36.dubbo一次性数据量太大出现的情况

答:会出现Dubbo报错Data length too large;首先看这种大数据是不是符合双方约定的,如果是的话就去修改生产者xml payload参数,否则可以加一些限制。

37.throw 和 throws 的区别

答:throw代表动作,表示抛出一个异常的动作;
throws代表一种状态,代表方法可能有异常抛出

throw用在方法实现中,而throws用在方法声明中;
throw只能用于抛出一种异常,而throws可以抛出多个异常

38.多线程锁

39.分布式锁原理

答:在多进程环境里面,通过外部的工具来达到加锁功能

40.redis的看门狗(在没有自定义释放时间才会生效)

答:是redission提供的自动延期机制,使得分布式锁可以自动延期,默认30秒。

41.分布式锁遇到的问题

答:(1)可能忘记了释放锁;(2)释放了别人的锁;(3)锁超时等问题

42.分布式锁的方式

答:redission、zk、数据库

43.线程池参数的设定

答:(1) IO 密集型任务:2*核心数+1
(2) CPU密集型任务:核心数+1
即使当计算(CPU)密集型的线程偶尔由于页缺失故障或者其他原因而暂停时,这个“额外”的线程也能确保 CPU 的时钟周期不会被浪费。

44.网络状态的含义:401等等

答:(1)401 Unauthorized:请求要求身份验证。客户端需要进行身份验证才能获取请求的内容。如果请求未包含有效的身份验证凭据,服务器可能返回此状态码。
(2)400 Bad Request:客户端发送的请求有错误。服务器不理解或无法处理客户端发送的请求。这可能是由于参数错误、缺少必要的信息或语法错误等引起的。
(3)403 Forbidden:服务器拒绝了客户端的请求。客户端没有访问请求的权限,无法获取请求的资源。
(4)404 Not Found:请求的资源不存在。服务器未能找到请求的资源。这可能是由于资源被删除或请求的 URL 错误等引起的。
(5)502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到无效的响应。通常表示上游服务器发生了故障或响应超时。

45.如何快速找到nginx目录

答:(1)在默认安装位置下查看,大多数一般会安装在默认位置下(/usr/local/openresty/nginx 或/usr/local/nginx)
(2)查看nginx进程(ps -aux|grep nginx)
(3)nginx运行进程,执行ls -l /proc/进程号/exe ,然后会打印出安装/运行位置

46.docker

答:docker是一个开源的应用容器引擎,开发者可以把程序及其依赖项打包到一个可移值的镜像中,可以在任意的linux/Windows系统上运行
这些镜像。

47.主从复制

48.jvm调优

49.Linux命令

50.消息中间件的原理(Kafka、Pulsar 等等)以及项目运用情况

51.数据库死锁(互斥条件、请求与保持条件、不剥夺条件、循环等待条件)
答:两个或多个事务竞争资源导致互相等待称为死锁

52.如何查看死锁
答:查看错误日志、使用命令:SHOW ENGINE INNODB STATUS

53.死锁解决方法:
答:手动解决:回滚其中一个事务
设置锁等待超时时间让其自动解除

54.如何避免死锁:
答:(1)避免大事务
(2)合理设计索引减少表扫描
(3)减少锁粒度

55.vue的生命周期
答:(1)创建阶段:beforeCreate(进行数据侦听和事件/侦听器的配置之前同步调用),created(可以访问数据了)
(2)挂载阶段:beforeMount(dom马上被渲染),mounted(dom被渲染出来了)
(3)更新阶段:beforeUpdate(数据发送了变化,dom还没更新),updated(数据更改导致dom被更改)
(4)销毁阶段:beforeDestroy(实例销毁前的调用),destroyed(实例被销毁,vue指令被解除)

56.vue如何防抖:
答:多次输入,只提交最后一次,主要思想就是定时器

57.前端vue如何节流:
答:多次点击,只执行一次函数

58.SpringBoot的自动装配
答:SpringBoot主要解决了Spring传统重量级xml配置bean
启动类里面有@SpringBootApplication注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan。
其中@SpringBootConfiguration注解标记启动类为配置类
@ComponentScan注解会去扫描启动类所在包及子包下面所标记的bean类由IOC去注册为bean
@EnableAutoConfiguration通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过AutoConfigurationImportSelector 类的 selectImports 方法去读取需要被自动装配的组件依赖下的spring.factories文件配置的组件的类全名,并按照一定的规则过滤掉不符合要求的组件的类全名,将剩余读取到的各个组件的类全名集合返回给IOC容器并将这些组件注册为bean

59.nacos
答:用来做动态服务发现、配置管理、服务管理平台
优点:可以动态的添加、删除服务实例,无须重启服务或者改代码
可以提供不同环境、角色的配置
支持流量管理,可以进行控制、限流和熔断
易于操作的管理界面
社区活跃

60.线程池队列类型:
LinkedBlockingDeque:链表同步阻塞队列
ArrayBlockingQueue:数组同步阻塞队列
SynchronousQueue:同步阻塞队列

 篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

(笔记渠道/点击)

61.如何引用bean,除了Resource和Autowired,出现了null什么原因,静态类不会依赖管理
答:静态方法获取bean实例,采用Resource和Autowired会导致空指针。
首先说说场景:我有一个工具类,这个工具类要去调数据库mapper做一些处理,静态方法里面要使用mapper,这个mapper必须有static。
分析原因:静态方法属于类本身,不依赖类的实例状态,无法直接访问。
解决办法:在某个类持有ApplicationContext 引用,通过他的上下文获取

62.hashmap如果冲突了,自身如何解决冲突
答:采用拉链法:类似hashmap在数组内添加一个链表

63.有一个Kafka配置页面,页面有信息录入和是否消费开关按钮,如何去设计(如果用多线程,如果管理)
答:

64.创建对象5种方式
答:省略

65.if/else 和swatch case
答:swith/case使用跳转表来提高效率,如果case数量较多,性能优于if/else
if/else是去遍历每个条件
如果分支少且条件复杂,选择if/else更合适

66.kafka分区和gourp
答:Kafka为了提高并发性,生产者会把数据分发到多个分区,多个消费者可以组成一个消费组,一个分区数据只会被消费组的一个消费。
建议消费组中的消费者数量和分区partition保持一致

67.Kafka消息堆积处理
答:分析是消费数量不够还是消费处理时间较长

68.同一个类,一个方法调用带@Transctional的方法,会导致事务不生效?
答:调用实际上是在当前类的实例内部发生的。因此,它不会触发 Spring AOP 代理的拦截,也就意味着不会触发事务管理器的拦截器

69.冒泡算法:
答:冒泡排序就是对待排序的的序列从前往后两两比较,如果发现逆序则交换,最终得到从小到大的顺序

70.修改文件权限、查看系统端口Linux命令
答:(1)修改文件权限:chmod 644 test.php  #只有拥有者可以修改, 其他人只能看文件内容.,chmod o+w test.php
文件所有者可以用字母 u (user)表示. 用户所在的组可以用字母 g (group)来表示. 其他人可以用字母 o (other)来表示. 所有人可以用字母 a (all)来表示.
(2)查看系统端口:netstat -ntlp//查看当前所有tcp端口·,查看一台服务器上面哪些服务及端口:netstat -lanp

71.gateway断言、过滤器类型
答:断言功能可以决定http请求应该由那个Route来做路由。就是我们nacos的predicates匹配规则
过滤器类型:
答:(1)网关过滤器(GatewayFilter):一般放在配置文件里面,比如nacos(spring.cloud.routes.filters),作用在所有路由上面
(2)全局过滤器(GlobalFilter):不用在配置文件中,比如全局日志过滤器,打印日志

72.AQS?
答:用于构建锁和同步器的基础框架,用于并发编程,基于FIFO(First In, First Out)等待队列的阻塞锁和同步器

73.maven命令
答:mvn -v、mvn package(依据项目生成 jar 文件 )、mvn install(在本地 Repository 中安装 jar )、mvn clean(清除目标目录中的生成结果)

74.Kafka的Broker、Partition
答:(1)Broker是Kafka的实例,
(2)Topic是消息的主题,可以理解为消息的分类,数据就保存在里面,每个Broker可以建立多个Topic
(3)Partition是Topic的分区,分区的作用就是负载,提高Kafka的吞吐量

75.java数据类型几种
答:八种基本数据类型:byte、short、int、long;float、double;char;boolean
四种引用类型:数组、接口、类、(枚举、注解、字符串、)

76.docker
答:

77.sa-token登录考虑
答:

78.xml模糊查询的写法
答:select * form user where name like concat('%',#{name},'%')

79.用mybatis的插件,需要实现什么
答:实现Interceptor 

80.redis list数据写入命令
答:lpush key value(将元素添加到列表左边),Rpush key value(将元素添加到列表右边)

81.ConcurrentHashMap的锁粒度
答:ConcurrentHashMap在jdk1.8采用CAS+synchronized实现更加细粒度的锁
锁的粒度指的是锁定共享资源的范围大小
在jdk1.7锁粒度是每个段(Segment),1.8是每个链表或红黑树的根节点

82.java内存
答:指的就是jvm内存模型

83.多线程包(JUC包):
答:JUC是java.util.concurrent包的简称

84.并发
答:

85.多线程

86.mysql批量插入
答:mybatis-plus实现批量插入:开启insertBatchSomeColumn();
自定义sql注入器,继承DefaultSqlInjector
将自定义sql注入器注册为bean
新建mapper继承BaseMapper,配置insertBatchSomeColumn()方法;

87.springboot的缺点
答:(1)升级困难,每次升级变更较大
(2)依赖大量第三方库,管理复杂且容易冲突
(3)资源占用较多

88.SpringBoot读取配置的6种方式
(1)使用@Value注解
(2)使用Environment接口
(3)使用@ConfigurationProperties注解
(4)使用PropertySource注解

89.对于一个大文件,如何分批读取来减轻内存压力呢
答:采用OpenCsv来读取,设置一个每次读取的行数,如果集合size大于了这个行数,就去处理数据并清空集合。

90.dubbo如何熔断
答:使用mock机制:@Reference(mock = "return 666")
配置熔断参数:配置超时时间和重试次数来,停止调用服务

91.Kafka和RabbitMQ的区别
答:应用场景方面:mq用于实时方面,可靠性要求比较高
Kafka用于活跃的流式数据,适合处理大数据量
消费模型:

92.mysql的@符号
答:主要用于定义和使用用户变量,

93.vue3路由类型
答:(1)基本路由:只包含一个路由对象参数
(2)命名路由:包含了多个路由参数

94.v-for为什么要用key
答:key的作用可以通过diff算法提高页面的渲染效率

95.left join 有大表和小表,谁放在前面?
答:让小表作为驱动表效率更高,他的扫描rows会更少

96.学生表,姓名、科目、成绩,找出全部科目都及格的学生
答:select name ,count(*)  from student s 
where grades >=60 group by name having count(*)>=3 ;
这里我限定三门了

97.领域驱动DDD(Domain-Driven Design,简称 DDD)
答:他是一种面向对象的设计方法,强调业务逻辑和领域模型置于软件设计中心。

总结:

首先就是把自己的项目讲清楚,特别是自己项目涉及的技术尽量把底层也弄懂,现在的面试占比可能项目占70%,八股文也就30%。如果有涉及笔试的话,建议多看看表结构设计,sql要能手写出来比较好。还有就是自己的简历可以多优化一下,不要太简单了,多找厉害的朋友参考参考。

标签:Java,面试,Spring,数据库,Kafka,2025,实例,参数,可以
From: https://blog.csdn.net/2401_89221867/article/details/144291412

相关文章

  • Java MyBatis返回两个字段作为Map的key和value
    使用MyBatis时,可能会遇到这种情况:只查询两个字段,需要返回一个Map,其中第一个字段作为key,第二个字段作为value。这种查询在某些场景非常好用,比如查询字典,查询出的key和value就是字典的value和label,利用HashMap的get方法时间复杂度为O(1)的特点,可以实现字典的快......
  • JAVA8的computeIfAbsent使用方法
    基础说明computeIfAbsent是Java8引入的Map接口中的一个默认方法。它允许你以原子操作的方式在给定键不存在时计算其值,并将其添加到映射中。如果该键已经存在,则返回已存在的值而不执行任何计算。下面是computeIfAbsent的基本用法:Map<K,V>map=newConcurrentHashMap<......
  • 2024-2025-1 20241322 《计算机基础与程序设计》第十一周学习总结
    2024-2025-120241322《计算机基础与程序设计》第十一周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK11这个作业的目标①计算机网络②网......
  • 无插件H5播放器EasyPlayer.js网页直播/点播播放器应该怎么使用JavaScript初始化?
    JavaScript可以用来控制播放器的基本功能,如播放、暂停、停止、快进、快退等。通过监听播放器的事件,JavaScript可以响应用户的操作,实现交互式控制。使用JavaScript,开发者可以创建自定义的播放器界面,而不是使用浏览器默认的控件。这可以通过操作DOM来实现,比如显示播放进度条、音量控......
  • 斗地主之顺子(Java & Python& JS & C++ & C )
    题目描述在斗地主扑克牌游戏中,扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成,且不能包含2。例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是......
  • 已入职华为大模型算法岗,面试真的很水的…
    觉得中大厂面试太难的,完全就是自己没准备充分,技术不到位,没准备的面试完全是浪费时间,更是对自己的不负责!今天我给大家分享一下我整理的大模型面试专题和答案,其中大部分都是面试常问的面试题,可以对照这查漏补缺奥!祝大家早日上岸呀!方向:大模型算法工程师整个面试持续了1小......
  • Java和.Net互相使用RSA加密时的问题和处理方法
    前言我们产品是使用JAVA语言开发的,有个供第三方获取Token的接口,过程大概就是第三方先调一个注册接口,获取一个RSA公钥,然后用通过公钥加密后的一些认证信息调用获取Token的接口,如果信息无误,则发放Token。前段时间就遇到了对方是使用.Net进行开发的系统,在第一步获取公钥时没用问题,......
  • 2024-2025-1 20241401 《计算机基础与程序设计》 第十一周学习总结
    班级链接2024计算机基础与程序设计作业要求第十一周作业作业目标①计算机网络②网络拓扑③云计算④网络安全⑤Web⑥HTML,CSS,Javascript⑦XML教材学习内容总结《计算机科学概论》第15、16章第15章计算机网络基础网络类型局域网(LAN):通常覆盖范围较小......
  • 二分查找及java代码实现
    二分查找(BinarySearch)是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来确定目标值所在的范围,然后在这个范围内继续进行二分查找,直到找到目标值或确定目标值不存在。二分查找的基本步骤:1. 初始化:设置两个指针,一个指向数组的开始(low),另一个指向......
  • 医院招聘考试管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远程......