25年10月大连云通信息技术 Java开发 实习 一面

#JAVA##JAVA面经##JAVA内推#

先简单聊聊自己吧~学校专业、怎么接触编程的,最近在忙些啥?

“我是XX大学计算机科学与技术专业大四学生。高中因信息学竞赛接触C++,大学用Java写第一个‘课程表查询系统’时被其工程化魅力吸引。最近三件事:
1️⃣ 毕业设计:《基于微服务的校园活动平台高可用优化》,用Spring Cloud + Redis + RabbitMQ重构单体架构
2️⃣ 技术沉淀:系统梳理JVM调优、分布式事务方案,输出技术博客5篇
3️⃣ 实习准备:深度复盘校园项目,针对性补强分布式系统知识
始终相信:技术人的成长 = 扎实基础 × 解决真实问题 × 持续反思。”

多线程有接触过吗?Java里创建线程一般有哪几种方式?你项目里用过哪种?

“接触深入。三种核心方式:
🔹 继承Thread(少用,单继承限制)
🔹 实现Runnable(解耦任务与线程)
🔹 线程池(ExecutorService)(项目首选)
项目实践

  • OJ判题服务:ThreadPoolExecutor自定义线程池(核心线程=CPU*2,队列=100)
  • 优势:
    ✅ 避免频繁创建销毁线程(资源复用)
    ✅ 精确控制并发数(防OOM)
    ✅ 任务拒绝策略兜底(CallerRunsPolicy触发降级)
    认知:直接new Thread是‘技术债’,线程池是生产环境底线。”

多个线程要共享数据,你会怎么处理?

“按场景精准选型:

场景 工具 项目实例
计数器 AtomicInteger 判题服务并发计数
缓存Map ConcurrentHashMap 用户会话存储(key=token)
复杂状态 ReentrantLock + Condition 抽奖库存扣减(lock.tryLock(3s))
简单同步 synchronized 单例模式双重检查锁
避坑经验
⚠️ 避免synchronized大方法(锁粒度粗)
⚠️ ConcurrentHashMapcomputeIfAbsent慎用(嵌套调用可能死锁)
✅ 优先用JUC工具类(经高并发验证)”

继承和接口在写代码时怎么选?

核心原则

  • 继承is-a关系 + 需复用父类实现(慎用!单继承限制)
  • 接口can-do能力 + 多实现扩展(首选)
    项目对比
    🔸 用接口(支付策略):
public interface PaymentStrategy { void pay(Order order); }
public class AlipayStrategy implements PaymentStrategy { ... }
// 新增微信支付只需实现接口,零修改原有代码

🔸 慎用继承:曾用BaseController抽公共方法,后因业务差异导致子类冗余重写。现改用:

  • 工具类(静态方法)
  • 组合模式(Service注入通用组件)
    感悟:接口定义契约,继承传递实现——优先面向接口编程。”

能手写一个排序吗?

“选归并排序(稳定、O(nlogn),适合链表/外部排序):
思路三步
1️⃣ :递归拆数组为左右两半(mid = left + (right-left)/2)
2️⃣ :左右子数组分别排序
3️⃣ :双指针合并两个有序数组(辅助数组暂存)
关键代码逻辑

void mergeSort(int[] arr, int l, int r) {
    if (l >= r) return;
    int mid = l + (r-l)/2;
    mergeSort(arr, l, mid);      // 左半排序
    mergeSort(arr, mid+1, r);    // 右半排序
    merge(arr, l, mid, r);       // 合并
}
void merge(int[] arr, int l, int mid, int r) {
    int[] tmp = new int[r-l+1];
    int i=l, j=mid+1, k=0;
    while (i<=mid && j<=r) tmp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
    while (i<=mid) tmp[k++] = arr[i++]; // 补剩余
    while (j<=r) tmp[k++] = arr[j++];
    System.arraycopy(tmp, 0, arr, l, tmp.length); // 覆盖原数组
}

项目应用:OJ系统中合并两个学生的提交记录(按时间排序),用此法避免不稳定排序导致的显示错乱。”

数据库主要用MySQL吧?索引这块帮了啥忙?

聚簇索引(主键索引):

  • 数据与索引存一起,查主键直接得数据(如SELECT * FROM orders WHERE id=100
  • 项目价值:订单查询避免回表,耗时<5ms
    联合索引
  • orders(user_id, status, create_time)
  • 三重收益
    ✅ 覆盖索引:SEL(Extra: Using index) ✅ 最左前缀: 走索引 ✅ 避免filesort: 直接走索引排序 :索引不是越多越好,每个索引都是写入成本——只为高频查询建。”

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

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

03-09 23:19
已编辑
东莞理工学院 Java
四场中厂面试复盘:没有套路的技术拷问,才是真的“熬人”最近面了四家公司,每轮面试都卡在1-1.5小时,快把精力耗干了。没有统一的套路,每家都有自己的“刁钻角度”,面完只觉得心力憔悴,也终于真切感受到现在中场面试的难度——比秋招真的难了一个档次,不是背八股、刷几道算法就能应付的。这次四场面试,最直观的感受就是没有两场是一样的,每一家的考察重点都戳在不同的能力维度上,稍微准备不充分就容易卡壳。第一家最考技术广度,不是单一问某个知识点,而是追着你要“方案+选型+底层逻辑”。比如聊分布式事务,我刚讲完Seata的TCC解决方案,面试官立刻追问:“还有什么替代方案?比如XA、SAGA,它们的核心区别是什么?解决的业务痛点一样吗?你为什么选TCC而不是其他?”&nbsp;还问了一个场景题:“有一张表,现有字段不确定是否能满足后续业务,要求在不修改原有字段的前提下做扩容,有哪些方案?每种方案的底层实现是什么?选这个方案的优势和风险是什么?”&nbsp;这类问题问了三四个,只要有一个知识点没覆盖到,或者说不出替代方案的对比,就会被一直追问,直到你把逻辑理透。有的面试官则死抠技术深度,不考你会不会用,考你懂不懂底层。比如聊线程池原理,我讲完核心参数、工作流程后,面试官直接追问:“线程池的底层实现用了哪些数据结构?任务队列的底层是怎么组织的?线程池的复用机制底层是怎么实现的?”&nbsp;甚至连&nbsp;ping&nbsp;命令都要挖到底:“&nbsp;ping&nbsp;命令发送的报文结构是什么样的?为什么要这么设计?每一个字段的作用是什么?”&nbsp;不是简单背概念,而是要你把具体细节讲出来,哪怕是一个小的设计点,都要解释清楚背后的原因。还有一家的问题偏得很意外,看似和核心技术无关,却在考你的基础认知和排查能力。比如问:“&nbsp;Ctrl+C&nbsp;为什么能停止一个程序?它的底层原理是什么?Ctrl+C一点可以停止吗”&nbsp;还有“你做过网络请求的优化吗?具体优化了哪些点?原理是什么?”&nbsp;甚至问通配符的类型有哪些、底层是怎么匹配的。这些问题不是高频考点,但能直接看出你对技术底层的理解,不是只停留在“能用”的层面。算法题和场景题也都是穿插在技术问答中间,不是单独抽出来考,而是结合业务场景问。比如聊RAG项目时,突然问:“如果向量库的查询性能瓶颈,你有什么优化方案?用到什么数据结构?索引怎么设计?”&nbsp;算法题也不是简单的LeetCode简单题,而是中等。而且面试全程没有“放水”环节,不管是技术问答、项目讲解,还是算法、场景题,都要实打实的回答。反问环节本来是放松的机会,但面完这么多场,反而没什么心情问,只觉得“终于结束了这一轮”,然后立刻要准备下一场的复盘和补漏。现在剩下还有两三轮这样的面试,说不焦虑是假的。但回头想想,这几场面试虽然难、熬人,却也把自己的知识漏洞和能力短板暴露得很彻底——原来不是自己“会了”,而是“懂的不够透”;不是没有方案,而是不会从多维度对比选型。中厂面试确实卷,HC也少,但每一场都是一次成长。接下来还是要好好复盘,把没答上来的问题逐个攻克,把底层逻辑再吃透一点,希望后面的面试能更从容一点后续更新面经
查看8道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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