查看原文
其他

小厂面试,被问麻了。。。

The following article is from 编程导航 Author 星球-HYZ

大家好呀,我是鱼皮。今天给朋友们分享一下自己 编程导航星球 成员 HYZ 同学的面经,写得非常详细,相信能给大家一些参考。

星球原文链接:https://t.zsxq.com/0bqbu8wup

面经分享

地点:珠海 规模:0~20 岗位:Java 来源:boss

面试总结

八股继续背,说话语速可以慢点让自己脑子清晰一下,git 相关知识需要补上,接口慢的知识需要补上,mybatis 的框架内容需要补上,【说一下理解】这种八股需要补上,mysql 的分库分表需要补上。

天天在b站看b友的面试视频,但是真刀真枪倒是怯了,还得多练

面试题

1.自我介绍

2.Java 常用的集合

list:arraylist、linkedlist set:hashset map:hashmap

参考回答:

Java 中的集合是指一组相关数据类型的对象的容器。Java 提供了许多集合类,可以根据实际情况选择适合的集合类来使用。

常用的 Java 集合包括:

  • List:有序可重复的集合,例如 ArrayList 和 LinkedList;
  • Set:无序不重复的集合,例如 HashSet 和 TreeSet;
  • Map:具有映射关系的键值对集合,例如 HashMap 和 TreeMap;
  • Queue:队列集合,例如 LinkedList 和 PriorityQueue。

另外还有一些特殊的集合类,例如 Stack(栈)和 Vector(向量)。

除了以上的标准集合类,Java 还提供了一些扩展集合类,例如 ConcurrentHashMapCopyOnWriteArrayList 等,它们是线程安全的集合类,适合在多线程环境下使用。

在使用集合类时,需要根据实际需求选择适合的集合类,不同的集合类有不同的优劣点。例如,如果需要有序存储对象并且需要快速访问集合中的元素,可以选择 ArrayList。如果需要频繁地插入和删除元素,可以选择 LinkedList。如果需要存储无序不重复的元素,可以选择 HashSet 等。

在使用集合类时,还需要注意集合类的并发性、可扩展性、性能等问题。

3.集合之间有什么区别

单值和 kv,数组、链表、数组链表红黑树

参考回答:

Java 中的集合主要分为三个大类:List、Set 和 Map。

  • List:有序集合,可以有重复元素。

  • Set:无序集合,不可以有重复元素。

  • Map:键值对集合,键不能重复,值可以重复。

具体来说,Java 集合的区别如下:

List 和 Set 的区别:List 是有序的,可以有重复元素,通过索引访问元素;Set 是无序的,不可以有重复元素,通过元素值访问元素。

Set 和 Map 的区别:Set 存储的是单个元素,Map 存储的是键值对。

List 和 Map 的区别:List 存储的是单个元素,通过索引访问元素;Map 存储的是键值对,通过键访问值。

此外,Java 集合还有许多其他的实现,如 SortedSet、LinkedHashMap、ConcurrentHashMap 等等,它们都有自己的特点和适用场景。

4.集合之间的转化有什么方式?

stream 的 map,list、set、map 的构造方法

参考回答:

Java 集合之间的转化可以使用以下方式:

  • 构造函数转化:集合之间可以通过构造函数进行转换,例如将 List 转换为 Set 可以使用 Set 的构造函数进行转换,例如 Set<T> set = new HashSet<>(list)。

  • 集合工具类转化:Java 提供了集合工具类,例如 Collections 和 Arrays,可以使用这些工具类进行集合之间的转换,例如将 List 转换为数组可以使用 toArray() 方法,将数组转换为 List 可以使用 Arrays.asList() 方法。

  • 类型强制转换:集合之间也可以使用类型强制转换进行转换,例如将 List 转换为 ArrayList 可以使用 (ArrayList<T>)list 进行强制类型转换。

  • 使用第三方库:Java 中有很多第三方库可以进行集合之间的转换,例如使用 Gson 库可以将 List 转换为 JSON 字符串,然后再将 JSON 字符串转换为其他集合类型。

需要注意的是,不同类型之间的转换可能会导致数据结构的改变或者丢失部分元素,因此在进行集合之间的转换时需要仔细考虑转换的类型和转换方式。

5.stream 流除了 map 还有什么其他方法

limit、max、min、avg、for,mysql能用的它基本也大差不差

参考回答:

Java 8 中的 Stream 流除了 map 方法外,还有很多其他方法,这里列举一些常用的:

  • filter(Predicate<T> predicate):对流中的元素进行过滤,只保留满足条件的元素。
  • distinct():去除流中的重复元素。
  • sorted():对流中的元素进行排序,默认为自然排序,也可以传入自定义的 Comparator。
  • peek(Consumer<T> action):对流中的元素进行遍历,同时执行指定的操作。
  • limit(long maxSize):限制流中元素的数量,只保留前 maxSize 个元素。
  • skip(long n):跳过流中的前 n 个元素,只保留剩余的元素。
  • reduce(BinaryOperator<T> accumulator):将流中的元素按照指定方式进行归约,返回归约的结果。
  • collect(Collector<T, A, R> collector):将流中的元素进行收集,返回指定类型的结果。

这些方法可以组合使用,构成复杂的数据处理操作,实现代码的简洁、高效。

6.stream 是 java 多少版本的新特性

8

7.说一下你对多线程的理解

不清楚

参考回答:

多线程是指在一个进程中同时运行多个线程,每个线程都拥有独立的代码执行流程和执行环境,它们可以共享进程的资源。多线程可以提高程序的并发性和效率,适用于需要同时进行多个任务或处理大量数据的场景。

多线程的优点包括:

  • 提高程序的并发性,能够同时处理多个任务,提高效率;
  • 充分利用 CPU 的多核特性,提高计算能力;
  • 可以将复杂的任务分解为多个子任务,分别在不同的线程中执行,提高程序的响应速度;
  • 可以通过线程间的通信来实现不同线程之间的协作,实现复杂的交互。

但是多线程也有一些缺点,包括:

  • 线程间的同步和通信需要花费额外的时间和精力,程序的复杂度和开发难度增加;
  • 线程间的竞争和冲突可能导致死锁、饥饿等问题,需要采用合适的同步机制进行控制;
  • 线程的创建和销毁需要消耗额外的系统资源,如果线程数量过多,会导致系统性能下降。

多线程在开发中的应用非常广泛,比如在 Web 服务器中,可以使用多线程来处理并发的请求;在数据处理中,可以使用多线程来提高计算能力和处理速度;在 GUI 界面中,可以使用多线程来保证程序的响应性等等。

8.什么时候用到多线程

不清楚

参考回答:

多线程一般用于需要同时处理多个任务的情况,可以提高程序的运行效率和响应速度。以下是一些常见的需要使用多线程的场景:

  • 需要同时处理多个网络请求或 IO 操作,例如服务器端接收多个客户端的请求;
  • 需要同时进行多个计算密集型任务,例如图像处理、视频编码等;
  • 需要同时进行多个并发操作,例如数据库并发读写、缓存并发操作等。

需要注意的是,多线程的实现需要考虑线程安全、锁的使用等问题,否则可能会出现线程间的竞争条件数据一致性问题。因此,在使用多线程时,需要慎重考虑,并且确保线程安全。

9.线程怎么用?

创建:继承 Thread 类,重写 Runable 方法,重写 callable 方法,使用线程池

调用:前三个直接用 start 方法,线程池用 submit 提交(想让面试官问四种常用线程池和线程池构造器的)

销毁:前三个执行完销毁,线程池调用 stop 或 shutdown 方法(想让面试官问俩方法有什么区别的)

10.run方法和start方法有什么区别

start 开启新的线程,run 和普通 java 方法没区别

11.说一下你对spring的理解

轻量级框架,提供了 ioc 控制反转和 aop 动态代理。

12.spring 的 bean 是什么时候初始化?

用到再初始化和实例化时初始化

13.bean是在什么阶段初始化,是spring 是用到初始化还是实例的时候初始化

都可以有,可以在实例化的时候初始化,也可以使用懒加载模式用到再初始化

14.spring 的bean 默认是单例还是多例的

单例,可以通过在配置文件或者配置类中修改 bean 的作用域为 prototype

15.说一下你对事务的理解

多个操作为一个集合,任意一个操作失败则集体失败回滚

16.spring 的事务怎么用

修改配置文件或者用 Transactional 注解

17.Java 当中让事务回滚

通过rollback指明异常回滚

18.springboot 有没有用过 api 文档

swagger

19.springboot 的控制层怎么接受前端参数(问 springmvc 的流程)

参考回答:

SpringBoot 中使用的是 SpringMVC 框架来实现 Web 应用程序的开发,因此 SpringBoot 中的 SpringMVC 流程和普通的 SpringMVC 流程基本一致。主要包括以下几个步骤:

一、请求到达 DispatcherServlet

用户请求首先会到达 SpringBoot 中的前置控制器 DispatcherServlet,该组件是整个 SpringMVC 的核心,负责接收请求并进行统一的处理。

二、处理器映射器 HandlerMapping 确定处理器

DispatcherServlet 会把请求交给处理器映射器 HandlerMapping,由它来找到符合请求的处理器(Controller),然后返回给 DispatcherServlet。

三、处理器适配器 HandlerAdapter 调用处理器方法

DispatcherServlet 获取到处理器(Controller)后,需要根据请求信息调用相应的处理方法,这时需要使用到处理器适配器 HandlerAdapter。处理器适配器会根据处理器的类型和请求类型,选择合适的方法进行调用。

四、处理器方法处理请求并返回模型和视图

Controller 接收到请求后,会根据请求的参数进行处理,然后返回一个 ModelAndView 对象,该对象包含了模型数据和要返回的视图。

五、视图解析器 ViewResolver 解析视图

DispatcherServlet 将 ModelAndView 交给视图解析器 ViewResolver,ViewResolver 根据视图名解析成一个具体的 View 对象。

六、渲染视图视图对象 View 负责渲染模型数据,将处理结果生成 HTML 内容返回给客户端。最终,DispatcherServlet 将响应返回给客户端。

以上就是 SpringBoot 中 SpringMVC 的流程,其中涉及到的每个组件都可以进行自定义配置。

20.怎么理解前后端分离

后端负责业务,不负责页面解析和渲染

参考回答:

前后端分离是一种软件开发架构模式,指的是将前端和后端的代码分别开发、部署、维护的一种架构方式。在这种架构模式下,前端负责展示界面和交互逻辑,后端则负责业务逻辑和数据处理。

前后端分离架构的主要思想是将前端和后端进行解耦,使得前后端的开发和维护变得更加独立和灵活。这种架构模式可以提高开发效率和代码复用性,同时也方便了团队协作和分工。

在前后端分离架构中,前端和后端之间通常采用 RESTful API 进行通信。前端通过 API 请求后端数据,并将其展示给用户。同时,前端还负责处理用户的操作,将用户的输入数据封装成 JSON 或其他格式,通过 API 发送给后端进行处理。

总之,前后端分离架构可以使得前端和后端的开发更加独立、高效和灵活,同时也能提供更好的用户体验和数据安全。

21.MyBatis 和 MyBatisPlus的区别

不清楚,只了解怎么使用

参考回答:

MyBatis和MyBatis Plus是两个Java持久层框架,都可以用于与关系型数据库交互。下面是它们的主要区别:

  1. 功能不同:MyBatis是一个半自动化的ORM框架,需要手动编写SQL语句,并将查询结果映射到Java对象中;而MyBatis Plus则是在MyBatis的基础上进行了增强,提供了更多便捷的操作方法,例如自动生成SQL语句、支持Lambda表达式等。

  2. 代码量不同:使用MyBatis编写数据库操作需要编写大量的XML文件和Java接口,而MyBatis Plus通过提供通用的Mapper和Service类,可以大幅减少代码量。

  3. 学习成本不同:MyBatis使用复杂度相对较高,需要熟悉XML和SQL,学习成本较高;而MyBatis Plus则提供了更多的便利,学习成本相对较低。

  4. 性能方面:MyBatis Plus相对于MyBatis可以在一定程度上提升性能,因为MyBatis Plus的代码生成器会生成更优化的SQL语句。

综上,MyBatis Plus 相较于 MyBatis 来说在操作的便利性、代码的简洁性、性能上都有一定的优势,但需要注意的是使用 MyBatis Plus 时需要对 MyBatis 的原理和机制有一定的了解。

22.mp 的查询怎么做比较多

querywrapper

23.mp 可以做多表的联合查询吗

不可,但是 MyBatis 的 association 和 collection 可以实现多表查询

24.说一下索引的理解

加快 sql 语句的执行速度(想要他问怎么加快,就可以从索引覆盖、聚集索引、二级索引切入了)

25.什么情况下需要建索引

通过慢查询判断 sql 慢的时候

26.慢查询指令说一下

show variables like '%slow_query_log';

27.查询单条 sql 是否走索引应该用什么关键字

explain

28.数据库的锁说一下

行锁、表锁、全局锁。共享锁、排他锁、意向锁。

update、delete、insert、select for update 加排他锁,select lock in shard mode 加共享锁,普通 select 不加锁

29.开发的时候什么情况下会产生锁和锁冲突

行锁、意向锁、表锁、共享锁、排他锁

参考回答:

在 MySQL 中,当一个事务正在对一行数据进行修改时,如果另外一个事务也要对该行数据进行修改,就会产生锁冲突。此时,MySQL 会自动给其中一个事务加锁,使其等待另一个事务执行完毕后再继续执行。产生锁和锁冲突的情况如下:

  • 行锁冲突:当多个事务同时修改同一行数据时,就会产生行锁冲突。

  • 表锁冲突:当多个事务同时修改同一张表的不同数据行时,也会产生表锁冲突。

  • 死锁:当多个事务同时持有资源(如行锁或表锁)并互相等待对方释放资源时,就会产生死锁。

其他情况:如使用 LOCK TABLES 等语句主动加锁时也会产生锁。

为避免锁和锁冲突,开发人员应该尽量避免使用不必要的锁,避免长时间占用资源,并合理设置事务隔离级别等参数,保证事务的正确性和并发性。

30.后端的性能优化有哪些方面?从影响性能的方面考虑一下。上线之后有一个接口响应特别慢,从哪里开始排查,有哪些切入点

完全不了解

参考回答:

后端性能优化可以从以下几个方面考虑:

  • 数据库性能优化:对 SQL 语句进行优化,增加索引,减少锁的使用等;
  • 系统配置优化:优化服务器硬件配置,调整操作系统参数,合理分配资源等;
  • 代码质量优化:消除代码中的资源浪费,减少重复计算,优化算法等;
  • 缓存优化:增加缓存机制,减少 IO 操作,加速数据访问等;
  • 并发控制优化:采用线程池,减少线程上下文切换,采用锁的优化机制等;

对于一个接口响应特别慢的问题,可以从以下几个方面排查:

  • 查看系统日志,分析是否存在异常,如是否有大量的 GC、OOM 等情况;
  • 使用监控工具对系统 CPU、内存、IO 等指标进行监控,查看是否存在性能瓶颈;
  • 查看数据库执行计划,分析 SQL 语句的性能;
  • 对代码进行分析,查找是否存在死循环、重复计算、资源浪费等情况;
  • 查看系统线程的情况,是否存在线程池拒绝服务等情况。

针对性能问题,可以从以上方面入手,逐步定位问题,并进行优化。

31.什么时候用缓存?Redis 是什么数据库?数据存在哪里

性能优化的时候可以考虑使用缓存,举例子;nosql;内存,也可以持久化,aof,rdb

32.如何从业务逻辑角度进行优化

其实提示我了,可以从 redis 的穿透、穿刺、雪崩三个角度去讲,也可以从 sql 的索引优化去讲。可惜当时还是太紧张了

33.java的业务逻辑实现在哪一层

service层

34.service 层的代码怎么去优化,怎么方式去写会有性能问题

完全不理解

参考回答:

  1. mysql 数据量大怎么进行优化

分库分表,没背

参考回答:

  1. git 出现代码冲突怎么处理 没了解

参考回答:

  1. git 和 sdk 的区别 没了解

参考回答:

  1. git 的分支什么时候用 开发、测试、上线不同的分支发布

  2. 说一下 springcloud 的理解,说一下 springcloud 和 spring boot 的理解

没了解,回答了 springcloud 是分布, springboot 是单体,讲了 springcloud 用了 nacos、feign、gateway 组件

参考回答:

40.我们什么时候使用 springcloud

没了解

参考回答:

41.说一下mp

说了简单模式、工作队列模式、发布订阅、路由模式、通配符模式

42.有没有关注技术网站

掘金

43.码云和 github 是否有关注

有,但是不多

44.前端有了解过吗?vue 了解吗

不了解,html 有用过,js 用过一下

星球活动

1.欢迎参与 30 天面试题挑战活动 ,搞定高频面试题,斩杀面试官!

2.欢迎已加入星球的同学 免费申请一年编程导航网站会员

3.欢迎学习 鱼皮最新原创项目教程,手把手教你做出项目、写出高分简历!

加入我们

欢迎加入鱼皮的编程导航知识星球,鱼皮会 1 对 1 回答您的问题、直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。

💎 加入星球后,您可以:

1)添加鱼皮本人微信,向他 1 对 1 提问,帮您解决问题、告别迷茫!点击了解详情

2)获取海量编程知识和资源,包括:3000+ 鱼皮的编程答疑和求职指导、原创编程学习路线、几十万字的编程学习知识库、几十 T 编程学习资源、500+ 精华帖等!点击了解详情

3)找鱼皮咨询求职建议和优化简历,次数不限!点击了解详情

4)鱼皮直播从 0 到 1 带大家做出项目,已有 50+ 直播、完结 3 套项目、10+ 项目分享,帮您掌握独立开发项目的能力、丰富简历!点击了解详情

外面一套项目课就上千元了,而星球内所有项目都有指导答疑,轻松解决问题

星球提供的所有服务,都是为了帮您更好地学编程、找到理想的工作。诚挚地欢迎您的加入,这可能是最好的学习机会,也是最值得的一笔投资!

长按扫码领优惠券加入,也可以添加微信 yupi1085 咨询星球(备注“想加星球”):

往期推荐

我的学习小圈子

来一大波后台开发项目推荐!

鱼皮精选文章汇总

谁会拒绝一个开源的 3D 博客呢?

考研失败,转码上岸

Mac 和 Win,到底用哪个系统学编程?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存