【面经合集】当 deepseek 遇上快手的面试|Java后端|01
🌟【友情提示】本篇面经来自粉丝投稿+智能润色,点击进入 -> 🔗互联网面经大全 围观25届校招修罗场!!每个技术细节都经过脱敏处理,请勿对号入座~
🌈 面试官:
咱们先聊聊异常处理吧,Checked和Runtime异常你一般怎么选型?
💬 小基:
最近重构代码时刚好遇到这个问题。比如处理用户上传文件时,如果文件类型不支持,我会用自定义Checked异常,这样调用方必须处理这个业务错误。但像数据库连接失败这种不可控异常,就直接抛RuntimeException。之前用Runtime异常导致线上有个文件解析失败没回滚,血泪教训啊!
🌈 面试官:
说说ArrayList和LinkedList的实战区别?
💬 小基:
我们项目有个实时行情推送功能需要频繁插入数据。最早用ArrayList,结果发现每秒几万条数据时经常触发数组扩容,GC压力大。后来改成LinkedList,插入确实快了,但遍历时iterator.next()耗时反而增加了。最后折中方案是用ArrayDeque,既支持头尾快速操作,内存又比LinkedList节省40%。
🌈 面试官:
假设需要设计一个洗衣服的程序,需要设计哪些对象?说说你的设计思路
💬 小基:
(挠头)这个真没准备过...要是现想的话,可能需要洗衣机对象(有水位、模式属性),衣服对象(材质、颜色),洗衣液对象(用量)。方法的话,洗衣机应该有启动()、暂停(),衣服可能有计算重量(),洗衣液可能有自动投放()?上次做智能家居项目时类似的设计,当时用状态模式管理设备状态迁移。
🌈 面试官:
多态在项目中怎么应用的?
💬 小基:
我们支付模块有个典型场景。比如支付成功后的通知,有短信、邮件、App推送三种方式。定义Notification接口的send()方法,不同实现类重写具体逻辑。在策略选择器里用Map存放所有实现类,根据配置动态获取具体实现。这样新增企业微信通知时,只需加个新类就行,完全不用改原有代码。
🌈 面试官:
写个分组反转链表吧,比如1->2->3->4->5,分组长度2,反转后2->1->4->3->5
💬 小基:
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy, end = dummy;
while (end.next != null) {
// 定位分组末尾
for (int i=0; i Redis怎么支撑秒杀流量的?
💬 **小基**:
> 去年双十一我们用Redis+Lua搞库存扣减。关键有三点:1)用连接池代替单连接,2)Pipeline批量处理请求,3)内存碎片率监控。有次大促redis突然卡顿,后来发现是有人用keys*命令扫key,改成scan指令后QPS从2万涨到8万。不过现在更推荐用redis-cluster分片。
🌈 面试官:
最后说说线程安全的理解?
💬 小基:
#快手##面经##deepseek#上次排查个诡异bug:用户积分偶尔会多扣。后来发现是用了HashMap存积分变更记录。改成ConcurrentHashMap后问题消失。现在写工具类都会先考虑无状态设计,比如用ThreadLocal存DateFormat。但也不是所有场景都要加锁,像最近做的监控数据采集,就用CopyOnWriteArrayList来平衡读写频率。
本专栏收集了互联网上的面试经验贴