愛在花開的季節 发表于 2025-3-26 21:12:01

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

目录
最近趁着金三银四面了五六家公司吧,也整理了一些题目供大家参考一下(适合经验三年左右的)。
面试题目(答案是我本身总结的,不肯定正确):
总结:
最近趁着金三银四面了五六家公司吧,也整理了一些题目供大家参考一下(适合经验三四年左右的)。

面试题目(答案是我本身总结的,不肯定正确):

   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中使用的比力多,事务模块和数据源模块都使用了工厂方法模式。
    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:同步阻塞队列
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要能手写出来比力好。另有就是本身的简历可以多优化一下,不要太简单了,多找厉害的朋友参考参考。
其次感觉整个行情变差了,工资也压得厉害。对于中小型自研公司他们需要比力万能的人吧,对于我这种底层码农感觉横向的学习挺重要的,好比前端开辟、Python这种可以多学学。
对于社招感觉面比力窄,好比零售的行业你必须要有零售开辟项目,制造业你可能得会ERP之类的。
感觉如今五年经验还挺受欢迎的,随便瞎写的,大家将就看。
外包慎重,加油!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Java 2024年面试总结(持续更新)