字节跳动一面
总时长一个半小时
自我介绍
因为我是非科班,加上学习的时间比较短,然后面试官问问平时是如何自学的。
介绍一下自己的项目
- 我介绍了我最近的一个社交论坛的SpringBoot结合SSM项目
- 主要围绕以下几点
- 基础功能的设计与完善
- 数据库设计、缓存设计
- 消息队列如何与项目结合的
- 项目未来如何改进(前后端分离,分布式微服务架构)
缓存和数据库的一致性是如何保证的
Redis缓存的过期时间是如何设计的
Redis的key是如何设计的
项目中用到了Redis的哪几种数据类型
项目中用户日活和访问量是如何统计的,是否有进行持久化
- 我没有持久化,其实应该持久化到数据库的
进程与线程有什么区别
- 从进程是资源分配的基本单位,线程是CPU调度的基本单位展开,结合Java进程和线程来回答了
HashMap是否了解说一下。
结合HashMap的一道场景题。
如果我们需要存进去一个股票Stack类,有两个字段name(String类型)和发行日期(Date类型),new 了两个Stack实例作为key,value是它的价格。如果把这两组k-v放入HashMap是否互相覆盖。
我的回答是不会的,因为没有重写hashCode和equals方法,后面下去自己做了验证
import java.util.*; public class Main { public static void main(String[] args) { HashMap<Stack, Integer> stackIntegerHashMap = new HashMap<>(); Date date = new Date(2022, 1, 12); Stack a = new Stack("aaa", date); Stack b = new Stack("aaa", date); stackIntegerHashMap.put(a, 12); stackIntegerHashMap.put(b, 13); System.out.println(stackIntegerHashMap.get(a)); System.out.println(stackIntegerHashMap.get(b)); } } class Stack { String name; Date date; public Stack(String name, Date date) { this.name = name; this.date = date; } }
如果Stack实例的name和date相同,我只需要最新的k-v键值对的话,怎么处理。(其实考察的是如何设计Stack类的hashCode和equals方法)
- 以下重写了hashCode和equals方法,发现只有放进去了一个k-v键值对了(其实hashCode方法的设计并不好,只是完成了功能)
import java.util.*; public class Main { public static void main(String[] args) { HashMap<Stack, Integer> stackIntegerHashMap = new HashMap<>(); Date date = new Date(2022, 1, 12); Stack a = new Stack("aaa", date); Stack b = new Stack("aaa", date); stackIntegerHashMap.put(a, 12); stackIntegerHashMap.put(b, 13); System.out.println(stackIntegerHashMap.get(a)); System.out.println(stackIntegerHashMap.get(b)); } } class Stack { String name; Date date; public Stack(String name, Date date) { this.name = name; this.date = date; } @Override public int hashCode() { return name.hashCode() + date.hashCode(); } @Override public boolean equals(Object obj) { return name.equals(((Stack) obj).name) && date.equals(((Stack) obj).date); } }
Object对象有什么方法
- 只知道几个常用的,建议看看源码😅
同一个类,synchronized关键字分别加在静态方法和普通方法上,如果在两个线程中分别运行这个类的同一个实例的这两个方法,请问这两个线程之间会相互阻塞吗?
- 不会的,一个是用this对象作为对象锁,一个用该类的Class对象做对象锁
为什么数据库加索引更快?
- 底层采用B+树作为索引的数据结构
为什么B+树查询更快(问的比较深,实际是想要我详细回答B+树的数据结构)
场景题:多用户买机票的售票系统如何设计(超卖问题)
围绕悲观锁和乐观锁展开,因为之前没有研究过,答得时候有漏洞,之后需要详细看看这种场景。
算法题
- 300. 最长递增子序列 - 力扣(LeetCode) (leetcode-cn.com)
- 16. 最接近的三数之和 - 力扣(LeetCode) (leetcode-cn.com)
- 算法题一直是自己的薄弱项,第一题磕磕绊绊半天,然后换第二题也没有想到最优解。这部分其实最拉胯了,感觉其实是在自己水平范围内的题目,但是还是没有答出来,说明自己在面试时候做算法题的经验和策略(不应该在上海30多度的时候在宿舍阳台面对宿舍阳面面试的,人热的晕晕乎乎的,脑子空白。但是疫情封闭又不想打扰舍友休息。之后应该和舍友商量一下,下午面试的时候尽量要在室内,毕竟天气越来越热了)都有问题,然后写题的时候还是尽量先自己想清楚,比如第一题,我随口说了暴力,其实心里想着可以用dp,然后面试官说"好啊,那你给我说说怎么暴力,和我想的是不是一样的",然后自己就一直在想怎么通过暴力再优化,然后就寄了。
总结:面试官人和友善,后面也耐心回答了关于业务的问题,回答的特别详细。自己前半段发挥正常,后面算法拉胯了,解题策略和能力都需要加强,所有,滚去刷LeetCode吧!!!
#实习面经##实习##面经#