异工同智-Java开发 一面 面经

1、请做个简单的自我介绍

您好,我叫[姓名],[学校][专业]毕业,目前有[X]年的Java开发经验。技术方面,我熟练掌握Java核心技术、Spring Boot、MyBatis、Redis、MySQL等主流技术栈,对微服务架构和分布式系统有一定的实践经验。项目经验上,我主要参与过企业管理系统、电商平台等项目的开发,负责过用户模块、订单模块等核心功能的设计和实现。在开发过程中,我比较注重代码质量和系统性能,遇到过一些技术难题也都通过学习和实践解决了。我对技术比较有热情,平时会关注一些技术博客和开源项目,持续提升自己的能力。希望能加入贵公司,在实际项目中继续成长。

2、MyBatis框架你了解多少,用过哪些特性

MyBatis是我项目中常用的持久层框架,我对它还是比较熟悉的:

  1. 基本使用方面,MyBatis通过XML或注解的方式配置SQL语句,把Java对象和数据库记录映射起来。我主要用XML方式,因为SQL和代码分离,维护起来更方便。常用的标签有select、insert、update、delete,还有resultMap用来做复杂的结果映射。
  2. 动态SQL方面,这是MyBatis很强大的功能。用if标签做条件判断,where标签自动处理AND和OR,foreach标签处理集合参数。比如做条件查询时,用户可能只输入部分条件,就用if标签动态拼接SQL,避免写很多重复代码。
  3. 参数传递方面,单个参数直接用#{参数名}接收,多个参数可以用@Param注解指定名称,或者封装成对象。#{}是预编译的,可以防止SQL注入,${}是直接拼接,一般不用。
  4. 结果映射方面,简单的查询MyBatis会自动映射,字段名和属性名对应。复杂的需要用resultMap,可以配置一对一、一对多的关联关系。比如查询订单带订单明细,就用collection标签配置一对多。
  5. 缓存机制方面,MyBatis有一级缓存和二级缓存。一级缓存是SqlSession级别的,默认开启,同一个SqlSession内相同查询会走缓存。二级缓存是Mapper级别的,需要手动开启,可以跨SqlSession共享。但实际项目中我们一般用Redis做缓存,MyBatis的缓存用得少。
  6. 插件机制方面,MyBatis支持拦截器,可以拦截Executor、StatementHandler等对象的方法。常用的分页插件PageHelper就是基于拦截器实现的。我们项目中用PageHelper做分页,很方便。
  7. 性能优化方面,要注意避免N+1查询问题,就是查询主表后循环查询关联表,会产生大量SQL。解决方法是用association或collection做关联查询,或者分两次查询在代码里组装。还要注意批量操作,用foreach标签批量插入或更新,比循环调用效率高很多。

3、Java中的集合框架有哪些,分别适用什么场景

Java集合框架主要分为两大类,Collection和Map:

  1. List接口下有ArrayList、LinkedList、Vector。ArrayList底层是数组,查询快增删慢,适合查询多的场景。LinkedList底层是双向链表,增删快查询慢,适合频繁插入删除的场景。Vector是线程安全的ArrayList,但性能差,现在基本不用了。我项目中最常用ArrayList,因为大部分场景都是查询多。
  2. Set接口下有HashSet、LinkedHashSet、TreeSet。HashSet基于HashMap实现,无序不重复,适合去重场景。LinkedHashSet保持插入顺序,适合需要保持顺序的去重。TreeSet基于红黑树,元素有序,适合需要排序的场景。我用HashSet做过用户标签去重,用TreeSet做过成绩排名。
  3. Queue接口下有LinkedList、PriorityQueue、ArrayDeque。LinkedList可以当队列用,先进先出。PriorityQueue是优先级队列,元素按优先级排序。ArrayDeque是双端队列,两端都可以操作,比LinkedList效率高。我用PriorityQueue做过任务调度,按优先级处理任务。
  4. Map接口下有HashMap、LinkedHashMap、TreeMap、Hashtable。HashMap是最常用的,键值对存储,查询效率O。LinkedHashMap保持插入顺序或访问顺序,可以用来实现LRU缓存。TreeMap按key排序,适合需要排序的场景。Hashtable是线程安全的HashMap,但性能差,现在用ConcurrentHashMap代替。
  5. 并发集合有ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等。ConcurrentHashMap是线程安全的HashMap,性能比Hashtable好很多。CopyOnWriteArrayList适合读多写少的场景,写时复制一份,不影响读操作。

选择集合的原则是:1)需要键值对用Map,需要单个元素用Collection;2)允许重复用List,不允许重复用Set;3)需要排序用TreeSet或TreeMap;4)多线程环境用并发集合;5)查询多用ArrayList,增删多用LinkedList。

4、数组和链表的优缺点分别是什么

数组和链表是两种基础的数据结构,各有优缺点:

数组的优点:1)随机访问效率高,通过下标可以O(1)时间访问任意元素,因为内存是连续的,可以直接计算地址;2)内存利用率高,只存储数据本身,没有额外的指针开销;3)缓存友好,连续内存访问时CPU缓存命中率高,性能好。

数组的缺点:1)插入删除效率低,中间插入或删除需要移动后面所有元素,时间复杂度O(n);2)大小固定,创建时就要确定大小,扩容需要重新分配内存并拷贝数据,成本高;3)内存要求高,需要一块连续的内存空间,大数组可能分配失败。

链表的优点:1)插入删除效率高,只需要修改指针,时间复杂度O(1),不需要移动元素;2)大小灵活,可以动态增长,不需要预先分配空间;3)内存要求低,不需要连续内存,可以利用碎片空间。

链表的缺点:1)随机访问效率低,访问第n个元素需要从头遍历,时间复杂度O(n);2)内存开销大,每个节点除了数据还要存储指针,双向链表要存两个指针;3)缓存不友好,节点在内存中不连续,访问时缓存命中率低。

实际应用中的选择:1)如果需要频繁随机访问,用数组,比如ArrayList;2)如果需要频繁插入删除,用链表,比如LinkedList;3)如果数据量固定且需要高性能访问,用数组;4)如果数据量不确定且需要灵活操作,用链表。

我在项目中遇到过一个性能问题,原来用Linked

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论

相关推荐

昨天 20:19
已编辑
门头沟学院 Java
太压力了,面了2个多小时,本菜比已经被拷打的瑟瑟发抖面完两个小时后通知过了1.算法题三道(1)leetcode124 二叉树中最大路径和hard题 因为不久前才刷过撕出来了,又来了一道(2)leetcode 300 最长递增子序列变种除了递增之外还加了一个权重因素,但是思路没变,dp就行(3)寻找词汇库里符合固定长度前缀的匹配单词应该是他们自己题库的题。给了一串单词列表,然后又给了一个单词,一个下标,根据这个下标的前缀去单词列表里面找到所有匹配的单词再返回思路是创建一个单词前缀树,然后根据树找,但是可能是构件树数有问题没撕出来2.全方位项目拷打基本没有问八股,全部都是项目企业场景题,哎哟我操,完全不会。我就纯八股战士,结果没想到一道八股都没问反正尽可能把企业场景往八股上引吧。。1. 微服务多点部署其中一个宕机了怎么办2. 要是mq占据大量CPU该怎么排查?MySQL占据大量CPU该怎么排查?3. 假如说让你实现视频点赞功能,你打算怎么设计?讲讲思路(我知道多级缓存,但是碰巧没背……寄)4. Redis延迟双删是什么,分布式锁,哨兵模式5. MySQL到es同步的延迟该怎么优化6. Rabbit mq的队列是怎么实现的?(这个完全没整明白,可能是队列的底层结构? 反正我硬扯的讲了一下rabbit mq的架构)还扯了很多,但是往后完全就慌了),记住的是这些
查看9道真题和解析
点赞 评论 收藏
分享
📍面试公司:转转🕐面试时间:03/05💻面试岗位:JAVA后端开发❓面试问题:1. 做一个简单的自我介绍(包含学校、技术栈、实习经历、项目职责)。2. 礼物连击场景中,两步操作是否需要保证原子性?为什么?具体怎么设计连击窗口?3. Redis Pipeline 的底层原理是什么?在项目中具体用来解决什么问题?用了哪些函数?4. 除了 Redis Pipeline,还有哪些方式可以实现命令批处理?5. Redis 和 MySQL 之间如何保证数据一致性?讲一下具体方案。6. 为什么推荐先删缓存再更新数据库,而不是先更新数据库再删缓存,也不直接更新缓存?7. 更新缓存会有什么问题?8. 项目中用到 2PC 分布式事务,性能怎么样?9. 该业务场景为什么必须要强一致性,而不是最终一致性?10. 除了 2PC,还有哪些分布式事务方案?(3PC、TCC、本地消息表、MQ 最终一致性等)11. 为什么在项目中选择 2PC,而不是其他分布式事务方案?12. 如何用责任链 + 本地缓存减少 50% 重复 RPC 调用?具体怎么做的?13. 为什么不直接把查询结果放到上下文传递,而要使用本地缓存?14. 异步线程池查询的参数是怎么设置的?依据是什么?15. 如果使用原生线程池,核心参数如何合理设置?16. 用 Java 原生线程池异步调用多服务,其中部分服务超时、异常,该如何处理?17. 为什么订单反查用本地缓存,而不用 Redis?18. Caffeine 和 Guava Cache 有什么区别?19. 项目中用到状态机框架,如果让你手写一个简单状态机,会用哪些设计模式?如何设计?20. 算法题:实现字符串转整数(只保留数字,处理正负号、非法字符、整数溢出,不能使用库函数)。21. 数据库设计题:订单属性表字段经常变动,如何设计表结构实现动态扩展、不修改原表?22. 实习/项目中遇到的最大挑战和复杂度最高的点是什么?如何解决?🙌面试感想:整场面试大约50分钟,主要根据实习经历,然后发散出来了一些八股的底层拷问,我个人觉得只有两个问题回答的不是很好,最后还是挂了,算法题也刷出来了,场景题也给出了三种方案,回想起来也就pipeline管道的底层原理没有说的很好,以及像订单部分超时的处理方式没有说到位(是跟我实习项目来的,我觉得我这个项目不会出现对应的情况,但是还是硬着头皮往下说了)除此之外,大部分问题回答的都还算比较饱满只能说好好复盘,不知道这后面还有没有机会
查看22道真题和解析
点赞 评论 收藏
分享
03-06 12:44
已编辑
门头沟学院 Java
是个千人厂,没听过名字。1. 做一个自我介绍。2. 你这个项目和技术栈从哪里学的?有报辅导班嘛[答 都是是自己网上学的,学校教的东西没用]3. 我看了你放在github上的项目,前端也是你写的嘛[答 AI写的,90%精力用于后端开发,前端单纯用于作为后端逻辑的可视化技术验证(骗你的其实后端也是AI写的)]4. 好,你觉得这些技术栈研究得最深刻的是哪个[答 八股压根没背到后面,昨晚背了MySQL就说MySQL]5. 那讲一下MySQL的索引[答 从B+树选型一路吟唱到联合索引,索引失效]6. 联合索引ABC问题,AB走索引嘛,BC走索引嘛?BAC走索引嘛?A or B 走索引嘛[走,不走,走,不走。面试官点头说可以]7. 讲一下项目里Redission分布式锁实现8. Watchdog机制具体是怎么工作9. 消息队列有考虑过Kafka嘛,怎么选型的10. 你这个项目消息队列可能出现什么问题,怎么解决这个问题?[瞎扯没用的,被面试官引导答了视频处理可能产生消息堆积问题,然后开始吟唱]11. 文件分片自己写的还是用的什么框架?上传进度的Redis数据结构?上传的视频有多大?小分片大小?12. 项目里Redis会话记忆是啥意思?[面试官说不行,没人把这个全放Redis里[生气R]]13. 那这和直接查数据库有什么区别[扯了Token成本和解决幻觉问题之类的,给面试官听笑了,我最后也没绷住]14. 你平时是怎么使用AI coding的15. 算法,给了我一个leedcode链接,一看做过了。然后换了一道三数之和,也做过了。然后面试官说算了,让我讲讲思路吧反问:1.有什么需要提高的地方2.介绍一下部门业务有哪些这个面试官真的感官非常非常好,问问题还疯狂引导,感觉不会也会了。找实习  牛客AI配图神器#
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务