北京药帮忙科技有限公司-Java 一面 面经

1. 谈谈 ArrayList 和 LinkedList 的区别

  • 底层数据结构ArrayList 基于动态数组实现;LinkedList 基于双向链表实现。
  • 访问性能ArrayList 支持随机访问,通过索引定位的时间复杂度为 O(1)LinkedList 需从头或尾遍历,时间复杂度为 O(n)
  • 增删效率ArrayList 在末尾增删较快,但在中间插入或删除需移动后续元素;LinkedList 插入或删除只需修改指针,复杂度为 O(1),但定位到目标节点仍需 O(n)
  • 内存开销ArrayList 空间连续,但有容量预留导致的碎片;LinkedList 每个节点需额外存储前后指针,单节点内存占用更高。

2. Thread、Runnable、Callable 的区别是什么?

  • 实现方式Thread 是类,受 Java 单继承限制;RunnableCallable 是接口,扩展性更好。
  • 返回值Runnablerun() 方法没有返回值;Callablecall() 方法支持返回结果,通常配合 FutureTask 使用。
  • 异常处理Runnable 只能在内部处理异常;Callable 允许声明抛出受检异常。
  • 推荐做法:生产环境通常使用 RunnableCallable 配合线程池执行,以实现资源复用和任务管理。

3. 索引的作用是什么?在项目中你是如何建索引的?

  • 核心作用:索引的本质是排好序的数据结构(B+ 树),通过减少磁盘 I/O 次数来加速数据检索。
  • 建索原则: 高频筛选:针对 WHERE、JOIN、ORDER BY 中的字段建立索引。区分度:优先选择离散度高的字段(如 ID、手机号),避免对重复率高的字段(如性别)建索引。复合索引:遵循最左匹配原则,优先建立联合索引以覆盖更多查询场景。覆盖索引:尽量让索引包含所有需要查询的列,避免回表操作提高性能。

4. 主键索引和联合索引的区别是什么?底层结构有何不同?

  • 主键索引(聚簇索引):叶子节点直接存储完整的行数据。一张表只能有一个主键索引。
  • 联合索引(非聚簇索引):叶子节点存储的是索引列的值值和对应的主键值。如果查询字段不在索引中,需要通过主键值进行“回表”。
  • 底层结构:两者都采用 B+ 树。区别在于联合索引的排序是基于多个列组合的,且叶子节点不含整行数据。

5. 线上高并发场景下你会选择什么集合?

  • 线程安全映射:使用 ConcurrentHashMap。Java 8 之后通过 CAS + synchronized 锁桶节点,保证了极高的并发写入性能。
  • 读多写少列表:使用 CopyOnWriteArrayList。采用“写时复制”策略,读操作完全无锁,适合配置表、白名单等场景。
  • 异步缓冲队列:使用 ArrayBlockingQueueLinkedBlockingQueue。利用其阻塞特性实现生产者-消费者模型,平衡系统负载。

6. 你对内存泄露有了解吗?通常如何解决?

  • 定义理解:对象不再被程序使用,但由于仍被 GC Root 引用导致无法被回收,最终可能引发 OOM。
  • 常见场景: 静态集合:长生命周期的 Map/List 持续持有对象。未关闭资源:IO 流、数据库连接、Socket 未手动关闭。ThreadLocal:使用完未调用 remove(),导致 Entry 堆积。
  • 解决方法:使用 jmap 或 Arthas 导出堆转储文件(Heap Dump),通过 VisualVM 或 MAT 分析引用链,定位强引用的根源并修复代码。

7. 动态代理你在哪些场景下使用到?

  • 框架层面: Spring AOP:实现声明式事务(@Transactional)和日志监控。MyBatis:为 Mapper 接口生成代理实现类,执行 SQL。
  • 业务应用: RPC 远程调用:为远程接口生成本地代理(Stub),隐藏底层网络传输细节。权限校验:在方法执行前统一进行用户身份认证和鉴权。

8. 介绍一下 Agent 项目的流程、RAG 与 Agent Loop 链路

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

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

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

全部评论
最后通过了吗
点赞 回复 分享
发布于 03-24 18:41 北京

相关推荐

04-04 14:31
门头沟学院 Java
这周三的面试,真的刷新了我对面试官的认知,全程体验差到极致,结束后越想越面试一开始,面试官就围绕我的项目经历展开提问,我全程如实阐述自己负责的模块——毕竟是多人协作的项目,每个成员都有明确分工,我不可能包揽所有工作,也没必要夸大自己的职责。可没想到,我的坦诚换来的却是对方的否定和嘲讽。他说我讲得太浅、不够深入,一旦遇到我答不上来的问题,就开始肆无忌惮地笑我,那种轻蔑的语气,真的让人很不舒服。更过分的是,在面试即将结束的时候,他还特意追加了一句嘲讽,态度傲慢又无礼,完全没有体现出对候选人的基本尊重。除此之外,负责技术面试的人,在我认真回答问题的过程中,还一直频繁打断我,根本不给我完整表达想法的机会,全程都是他主导节奏,甚至不等我说完就随意切换话题。我一直很认同一个观点:面试从来都不是单方面的筛选,而是双向选择。就算面试官觉得我不合适、不符合岗位预期,大可以直接结束面试,既节约双方的时间,也保留彼此的体面,没必要用贬低、嘲讽的方式去伤害候选人。我全程语气平和,对待他提出的每一个问题,都在认真思考、尽力回应,没有丝毫敷衍。专业能力的高低,可以客观评判、合理提出建议,但人与人之间最基本的尊重,不该被忽视,更不该被践踏。求职路上难免遇到各种糟心的事,但这样不尊重人的面试官,还是第一次遇到。希望大家都能避开这种不专业的面试,遇到懂得尊重人的面试官和靠谱的公司🙏
点赞 评论 收藏
分享
03-24 10:13
辽宁大学 Java
手撕两道 30min1.lc1190 反转每对括号间的子串2.数组实现高精度加法八股 30min1. 类加载机制2. jvm内存模型3. 介绍一下垃圾回收4. 垃圾回收算法,详细介绍一下5. stringbuffer和stringbuilder的区别6. java常见集合类7. hashmap底层原理8. 红黑树有什么特点,为什么用红黑树不用别的树9. hash是线程安全的吗,怎么实现线程安全10. concurenthashmap原理11. hashmap有记录插入顺序吗,假如我put 一个A,B,C进去然后我用for去循环他的话,他能A,B,C输出出来吗12. 如果我想维护这个插入顺序的话应该怎么办13. 线程池原理14. threadlocal是什么15. 使用threadlocal的时候需要注意什么16. IOC原理17. spring中的bean是什么18. 介绍一下spring中常见的注解19. MySQL查询很慢的话,怎么优化20. 最左匹配原则21. 索引ABC,where CBA能用上吗22. MySQL三大日志23. Redis分布式锁原理24. 一个服务通过redis抢到锁了是吧?嗯,然后这个服务挂了,那这个锁一直一直在那里,那怎么办呢?25. redis如果挂了它重启的话,里面的数据会丢失吗?26. Redis持久化27. 缓存击穿和缓存穿透28. 布隆过滤器它的原理是什么29. 说一下你在这个项目中啊遇到的一些比较比较麻烦的一些问题,还有是怎么解决的30. RAG这个方式有什么优缺点?31. 你在使用那个大模型的那个过程中有没有遇到过这种问题?就是说想希望它稳定的输出这种这一种格式
isolate9:是hr与管理线么
今天你投了哪些公司?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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