大家好,我是二哥呀。
近期,字节对年终奖进行了大刀阔斧的调整,简单点说,就是基数和系数双重放大,对于那些绩效高的小伙伴来说,年终奖要比往年高一大截,爽歪歪。
现金部分最高可达 3 个月,绩效突出的员工还可以获得额外的期权,约 10%。并且部分期权奖励直接改为现金形式发放。真正做到落袋为安,舒服。 绩效期权将以月总包(包括月薪和期权月均价值)作为计算基数。
总之就是,公司挣钱了,给员工们喝点汤。据查,最新一轮的期权回购价格是每股 1279 元(约),10 股就差不多 13k 了。并且不同于入职时的按季归属,绩效期权时按月匀速归属的,且一旦归属后即可全部申请参与公司回购。
这下,心脏又有跳动的动力了()
昨天看字节官方招聘说,25 届目前还有 1000+ HC,包括客户端、前端、测试、后端等岗位,最后一场笔试的时间为 12 月 4 日 19:20-21:00,所以向往字节的小伙伴们可以再冲刺几天。
秋招扫尾阶段,有一个很有趣的现象就是,你以为自己没戏了,结果是个捡漏王,以前你觉得高攀不起的,现在可能反而很轻松。
星球里也有不少球友拿到字节的 offer,薪资幅度还是很不错的,大家也可以接接好运,也许就能赶在最后的冲刺阶段上岸了呢。
那接下来,我们就以 Java 面试指南中收录的字节跳动面经同学 19 番茄小说一面为例,来看看如果想备战字节这种大厂面试的话,应该如何去准备。
从这份面经能看得出来,整体难度在大厂里属于比较低的那种了,所以,不要对大厂怀有畏惧感,放平心态,你真的也可以。
1、《30 天速通 Java.pdf》下载 2、三分恶面渣逆袭在线版:https://javabetter.cn/sidebar/sanfene/nixi.html
字节跳动面经同学19番茄小说一面
static关键字的使用
static 关键字可以用来修饰变量、方法、代码块和内部类,以及导入包。
修饰对象 | 作用 |
---|---|
变量 | 静态变量,类级别变量,所有实例共享同一份数据。 |
方法 | 静态方法,类级别方法,与实例无关。 |
代码块 | 在类加载时初始化一些数据,只执行一次。 |
内部类 | 与外部类绑定但独立于外部类实例。 |
导入 | 可以直接访问静态成员,无需通过类名引用,简化代码书写,但会降低代码可读性。 |
多态的用法,多态的实现原理
多态指同一个接口或方法在不同的类中有不同的实现,比如说动态绑定,父类引用指向子类对象,方法的具体调用会延迟到运行时决定。
举例,现在有一个父类 Wanger,一个子类 Wangxiaoer,都有一个 write 方法。现在有一个父类 Wanger 类型的变量 wanger,它在执行 wanger.write()
时,究竟调用父类 Wanger 的 write()
方法,还是子类 Wangxiaoer 的 write()
方法呢?
//子类继承父类
class Wangxiaoer extends Wanger {
public void write() { // 子类覆盖父类方法
System.out.println("记住仇恨,表明我们要奋发图强的心智");
}
public static void main(String[] args) {
// 父类引用指向子类对象
Wanger[] wangers = { new Wanger(), new Wangxiaoer() };
for (Wanger wanger : wangers) {
// 对象是王二的时候输出:勿忘国耻
// 对象是王小二的时候输出:记住仇恨,表明我们要奋发图强的心智
wanger.write();
}
}
}
class Wanger {
public void write() {
System.out.println("勿忘国耻");
}
}
答案是在运行时根据对象的类型进行后期绑定,编译器在编译阶段并不知道对象的类型,但是 Java 的方法调用机制能找到正确的方法体,然后执行,得到正确的结果,这就是多态的作用。
多态的实现原理是什么?
多态通过动态绑定实现,Java 使用虚方法表存储方法指针,方法调用时根据对象实际类型从虚方法表查找具体实现。
Hashtable与HashMap
HashMap 不是线程安全的,因此在早期的 JDK 版本中,是用 Hashtable 来保证线程安全的。
①、Hashtable 是直接在方法上加 synchronized 关键字,比较粗暴。
String,StringBuilder,StringBuffer的区别,使用性能
String
、StringBuilder
和StringBuffer
在 Java 中都是用于处理字符串的,它们之间的区别是,String 是不可变的,平常开发用得最多,当遇到大量字符串连接时,就用 StringBuilder,它不会生成很多新的对象,StringBuffer 和 StringBuilder 类似,但每个方法上都加了 synchronized 关键字,所以是线程安全的。
Linux中的IO多路复用
IO 多路复用是一种高效管理多个 IO 事件的技术,通过单线程监控多个文件描述符(fd),实现高并发的 IO 操作。
常见的 I/O 多路复用机制包括 select、poll 和 epoll 等。
特性 | select | poll | epoll |
---|---|---|---|
文件描述符限制 | 受 FD_SETSIZE 限制 | 无限制 | 无限制 |
时间复杂度 | O(n) | O(n) | O(1) |
数据复制 | 需要 | 需要 | 不需要 |
工作方式 | 线性扫描 | 线性扫描 | 事件通知 |
内核支持 | 所有 UNIX 系统 | 所有 UNIX 系统 | Linux 2.6 及以上版本 |
适用场景 | 少量连接 | 中等连接 | 大量并发连接 |
比如说你是一名数学老师,上课时提出了一个问题:“今天谁来证明一下勾股定律?”
同学小王举手,你就让小王回答;小李举手,你就让小李回答;小张举手,你就让小张回答。
这种模式就是 IO 多路复用,你只需要在讲台上等,谁举手谁回答,不需要一个一个去问。
Redis 就是使用 epoll 这样的 I/O 多路复用机制,在单线程模型下实现高效的网络 I/O,从而支持高并发的请求处理。
MySQL中的事务
事务是一条或多条 SQL 语句组成的执行单元,要么全部执行成功,要么全部失败,不会出现部分执行的情况。
事务具有四个基本特性,也就是通常所说的 ACID 特性,即原子性、一致性、隔离性和持久性。主要作用是保证数据库操作的一致性。
事务隔离级别,哪个是默认的,特点
事务的隔离级别定了一个事务可能受其他事务影响的程度,MySQL 支持的四种隔离级别分别是:读未提交、读已提交、可重复读和串行化。
什么是读未提交?
读未提交是最低的隔离级别,在这个级别,当前事务可以读取未被其他事务提交的数据,以至于会出现“脏读”、“不可重复读”和“幻读”的问题。
什么是读已提交?
在读已提交级别,当前事务只能读取已经被其他事务提交的数据,可以避免“脏读”现象。但不可重复读和幻读问题仍然存在。
什么是可重复读?
可重复读能够确保在同一事务中多次读取相同记录的结果是一致的,即使其他事务对这条记录进行了修改,也不会影响到当前事务。
可重复读是 MySQL 默认的隔离级别,避免了“脏读”和“不可重复读”,但可能会出现幻读。
什么是串行化?
串行化是最高的隔离级别,通过强制事务串行执行来避免并发问题,可以解决“脏读”、“不可重复读”和“幻读”问题。
但会导致大量的超时和锁竞争问题。
MySQL中一条SQL的执行流程
我就说一下查询语句的吧。
第一步,客户端发送 SQL 查询语句到 MySQL 服务器。
第二步,MySQL 服务器的连接器开始处理这个请求,跟客户端建立连接、获取权限、管理连接。
第三步(MySQL 8.0 以后已经干掉了),连接建立后,MySQL 服务器的查询缓存组件会检查是否有缓存的查询结果。如果有,直接返回给客户端;如果没有,进入下一步。
第三步,解析器对 SQL 语句进行解析,检查语句是否符合 SQL 语法规则,确保引用的数据库、表和列都是存在的,并处理 SQL 语句中的名称解析和权限验证。
第四步,优化器负责确定 SQL 语句的执行计划,这包括选择使用哪些索引,以及决定表之间的连接顺序等。
第五步,执行器会调用存储引擎的 API 来进行数据的读写。
第六步,MySQL 的存储引擎是插件式的,不同的存储引擎在细节上面有很大不同。例如,InnoDB 是支持事务的,而 MyISAM 是不支持的。之后,会将执行结果返回给客户端
第七步,客户端接收到查询结果,完成这次查询请求。
https与http的区别,加密的实现
HTTPS 是 HTTP 的增强版,在 HTTP 的基础上加入了 SSL/TLS 协议,确保数据在传输过程中是加密的。
HTTP 的默认端⼝号是 80,URL 以http://
开头;HTTPS 的默认端⼝号是 443,URL 以https://
开头。
SSL/TLS 在加密过程中涉及到了两种类型的加密方法:
非对称加密:服务器向客户端发送公钥,然后客户端用公钥加密自己的随机密钥,也就是会话密钥,发送给服务器,服务器用私钥解密,得到会话密钥。 对称加密:双方用会话密钥加密通信内容。
键入url到页面显示的流程
这个过程包括多个步骤,涵盖了 DNS 解析、TCP 连接、发送 HTTP 请求、服务器处理请求并返回 HTTP 响应、浏览器处理响应并渲染页面等多个环节。
DNS 解析:浏览器会发起一个 DNS 请求到 DNS 服务器,将域名解析为服务器的 IP 地址。 TCP 连接:浏览器通过解析得到的 IP 地址与服务器建立 TCP 连接。这一步涉及到 TCP 的三次握手,用于确保双方都已经准备好进行数据传输了。 发送 HTTP 请求:浏览器构建 HTTP 请求,包括请求行、请求头和请求体;然后将请求发送到服务器。 服务器处理请求:服务器接收到 HTTP 请求后,根据请求的资源路径,经过后端处理,生成 HTTP 响应消息;响应消息包括状态行、响应头和响应体。 浏览器接收 HTTP 响应:浏览器接收到服务器返回的 HTTP 响应数据后,开始解析响应体中的 HTML 内容;然后构建 DOM 树、解析 CSS 和 JavaScript 文件等,最终渲染页面。 断开连接:TCP 四次挥手,连接结束。
我们以输入 www.baidu.com 为例:
TCP断开连接过程
TCP 连接的断开过程被形象地概括为四次挥手。
第一次挥手:客户端向服务器发送一个 FIN 结束报文,表示客户端没有数据要发送了,但仍然可以接收数据。客户端进入 FIN-WAIT-1 状态。
第二次挥手:服务器接收到 FIN 报文后,向客户端发送一个 ACK 报文,确认已接收到客户端的 FIN 请求。服务器进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
第三次挥手:服务器向客户端发送一个 FIN 报文,表示服务器也没有数据要发送了。服务器进入 LAST-ACK 状态。
第四次挥手:客户端接收到 FIN 报文后,向服务器发送一个 ACK 报文,确认已接收到服务器的 FIN 请求。客户端进入 TIME-WAIT 状态,等待一段时间以确保服务器接收到 ACK 报文。服务器接收到 ACK 报文后进入 CLOSED 状态。客户端在等待一段时间后也进入 CLOSED 状态。
TIME_WAIT
TIME-WAIT 发生在第四次挥手,当客户端在发送 ACK 确认对方的 FIN 报文后,会进入 TIME_WAIT 状态。
它存在的意义主要有两个:
在 TIME_WAIT 状态中,客户端可以重新发送 ACK 确保对方正常关闭连接。 在 TIME_WAIT 持续的 2MSL 时间后,确保旧数据包完全消失,避免它们干扰未来建立的新连接。
补充:MSL(Maximum Segment Lifetime):TCP 报文段在网络中的最大存活时间,通常为 30 秒到 2 分钟
ending
一个人可以走得很快,但一群人才能走得更远。二哥的编程星球已经有 6600 多名球友加入了,如果你也需要一个良好的学习环境,戳链接 🔗 加入我们吧。这是一个 编程学习指南 + Java 项目实战 + LeetCode 刷题 + 简历精修 的私密圈子,你可以阅读星球专栏、向二哥提问、帮你制定学习计划、和球友一起打卡成长。
两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远。
欢迎点击左下角阅读原文了解二哥的编程星球,这可能是你学习求职路上最有含金量的一次点击。
最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。共勉 💪。