字节年终奖,涨到怀疑人生。

科技   2024-11-27 14:05   河南  

大家好,我是二哥呀。

近期,字节对年终奖进行了大刀阔斧的调整,简单点说,就是基数和系数双重放大,对于那些绩效高的小伙伴来说,年终奖要比往年高一大截,爽歪歪。

  • 现金部分最高可达 3 个月,绩效突出的员工还可以获得额外的期权,约 10%。并且部分期权奖励直接改为现金形式发放。真正做到落袋为安,舒服。
  • 绩效期权将以月总包(包括月薪和期权月均价值)作为计算基数。

总之就是,公司挣钱了,给员工们喝点汤。据查,最新一轮的期权回购价格是每股 1279 元(约),10 股就差不多 13k 了。并且不同于入职时的按季归属,绩效期权时按月匀速归属的,且一旦归属后即可全部申请参与公司回购。

这下,心脏又有跳动的动力了(

昨天看字节官方招聘说,25 届目前还有 1000+ HC,包括客户端、前端、测试、后端等岗位,最后一场笔试的时间为 12 月 4 日 19:20-21:00,所以向往字节的小伙伴们可以再冲刺几天。

秋招扫尾阶段,有一个很有趣的现象就是,你以为自己没戏了,结果是个捡漏王,以前你觉得高攀不起的,现在可能反而很轻松。

星球里也有不少球友拿到字节的 offer,薪资幅度还是很不错的,大家也可以接接好运,也许就能赶在最后的冲刺阶段上岸了呢。

那接下来,我们就以 Java 面试指南中收录的字节跳动面经同学 19  番茄小说一面为例,来看看如果想备战字节这种大厂面试的话,应该如何去准备。

背八股就认准三分恶的面渣逆袭

从这份面经能看得出来,整体难度在大厂里属于比较低的那种了,所以,不要对大厂怀有畏惧感,放平心态,你真的也可以。

字节跳动面经同学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 关键字,比较粗暴。

二哥的 Java 进阶之路:Hashtable

String,StringBuilder,StringBuffer的区别,使用性能

StringStringBuilderStringBuffer在 Java 中都是用于处理字符串的,它们之间的区别是,String 是不可变的,平常开发用得最多,当遇到大量字符串连接时,就用 StringBuilder,它不会生成很多新的对象,StringBuffer 和 StringBuilder 类似,但每个方法上都加了 synchronized 关键字,所以是线程安全的。

Linux中的IO多路复用

IO 多路复用是一种高效管理多个 IO 事件的技术,通过单线程监控多个文件描述符(fd),实现高并发的 IO 操作。

常见的 I/O 多路复用机制包括 select、poll 和 epoll 等。

特性selectpollepoll
文件描述符限制FD_SETSIZE 限制无限制无限制
时间复杂度O(n)O(n)O(1)
数据复制需要需要不需要
工作方式线性扫描线性扫描事件通知
内核支持所有 UNIX 系统所有 UNIX 系统Linux 2.6 及以上版本
适用场景少量连接中等连接大量并发连接

比如说你是一名数学老师,上课时提出了一个问题:“今天谁来证明一下勾股定律?”

同学小王举手,你就让小王回答;小李举手,你就让小李回答;小张举手,你就让小张回答。

这种模式就是 IO 多路复用,你只需要在讲台上等,谁举手谁回答,不需要一个一个去问。

有盐先生:IO 多路复用

Redis 就是使用 epoll 这样的 I/O 多路复用机制,在单线程模型下实现高效的网络 I/O,从而支持高并发的请求处理。

MySQL中的事务

事务是一条或多条 SQL 语句组成的执行单元,要么全部执行成功,要么全部失败,不会出现部分执行的情况。

事务具有四个基本特性,也就是通常所说的 ACID 特性,即原子性、一致性、隔离性和持久性。主要作用是保证数据库操作的一致性。

三分恶面渣逆袭:事务四大特性

事务隔离级别,哪个是默认的,特点

事务的隔离级别定了一个事务可能受其他事务影响的程度,MySQL 支持的四种隔离级别分别是:读未提交、读已提交、可重复读和串行化。

三分恶面渣逆袭:事务的四个隔离级别

什么是读未提交?

读未提交是最低的隔离级别,在这个级别,当前事务可以读取未被其他事务提交的数据,以至于会出现“脏读”、“不可重复读”和“幻读”的问题。

什么是读已提交?

在读已提交级别,当前事务只能读取已经被其他事务提交的数据,可以避免“脏读”现象。但不可重复读和幻读问题仍然存在。

什么是可重复读?

可重复读能够确保在同一事务中多次读取相同记录的结果是一致的,即使其他事务对这条记录进行了修改,也不会影响到当前事务。

可重复读是 MySQL 默认的隔离级别,避免了“脏读”和“不可重复读”,但可能会出现幻读。

什么是串行化?

串行化是最高的隔离级别,通过强制事务串行执行来避免并发问题,可以解决“脏读”、“不可重复读”和“幻读”问题。

但会导致大量的超时和锁竞争问题。

MySQL中一条SQL的执行流程

我就说一下查询语句的吧。

二哥的 Java 进阶之路:SQL 执行

第一步,客户端发送 SQL 查询语句到 MySQL 服务器。

第二步,MySQL 服务器的连接器开始处理这个请求,跟客户端建立连接、获取权限、管理连接。

第三步(MySQL 8.0 以后已经干掉了),连接建立后,MySQL 服务器的查询缓存组件会检查是否有缓存的查询结果。如果有,直接返回给客户端;如果没有,进入下一步

第三步,解析器对 SQL 语句进行解析,检查语句是否符合 SQL 语法规则,确保引用的数据库、表和列都是存在的,并处理 SQL 语句中的名称解析和权限验证。

第四步,优化器负责确定 SQL 语句的执行计划,这包括选择使用哪些索引,以及决定表之间的连接顺序等。

第五步,执行器会调用存储引擎的 API 来进行数据的读写。

第六步,MySQL 的存储引擎是插件式的,不同的存储引擎在细节上面有很大不同。例如,InnoDB 是支持事务的,而 MyISAM 是不支持的。之后,会将执行结果返回给客户端

第七步,客户端接收到查询结果,完成这次查询请求。

https与http的区别,加密的实现

HTTPS 是 HTTP 的增强版,在 HTTP 的基础上加入了 SSL/TLS 协议,确保数据在传输过程中是加密的。

二哥的 Java 进阶之路:http和 https 的区别

HTTP 的默认端⼝号是 80,URL 以http://开头;HTTPS 的默认端⼝号是 443,URL 以https://开头。

SSL/TLS 在加密过程中涉及到了两种类型的加密方法:

  • 非对称加密:服务器向客户端发送公钥,然后客户端用公钥加密自己的随机密钥,也就是会话密钥,发送给服务器,服务器用私钥解密,得到会话密钥。
  • 对称加密:双方用会话密钥加密通信内容。
三分恶面渣逆袭:HTTPS 主要流程

键入url到页面显示的流程

这个过程包括多个步骤,涵盖了 DNS 解析、TCP 连接、发送 HTTP 请求、服务器处理请求并返回 HTTP 响应、浏览器处理响应并渲染页面等多个环节。

  1. DNS 解析:浏览器会发起一个 DNS 请求到 DNS 服务器,将域名解析为服务器的 IP 地址。
  2. TCP 连接:浏览器通过解析得到的 IP 地址与服务器建立 TCP 连接。这一步涉及到 TCP 的三次握手,用于确保双方都已经准备好进行数据传输了。
  3. 发送 HTTP 请求:浏览器构建 HTTP 请求,包括请求行、请求头和请求体;然后将请求发送到服务器。
  4. 服务器处理请求:服务器接收到 HTTP 请求后,根据请求的资源路径,经过后端处理,生成 HTTP 响应消息;响应消息包括状态行、响应头和响应体。
  5. 浏览器接收 HTTP 响应:浏览器接收到服务器返回的 HTTP 响应数据后,开始解析响应体中的 HTML 内容;然后构建 DOM 树、解析 CSS 和 JavaScript 文件等,最终渲染页面。
  6. 断开连接:TCP 四次挥手,连接结束。

我们以输入 www.baidu.com 为例:

三分恶面渣逆袭:www.baidu.com URL 到显示主页

TCP断开连接过程

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 状态的作用

它存在的意义主要有两个:

  • 在 TIME_WAIT 状态中,客户端可以重新发送 ACK 确保对方正常关闭连接。
  • 在 TIME_WAIT 持续的 2MSL 时间后,确保旧数据包完全消失,避免它们干扰未来建立的新连接。

补充:MSL(Maximum Segment Lifetime):TCP 报文段在网络中的最大存活时间,通常为 30 秒到 2 分钟

ending

一个人可以走得很快,但一群人才能走得更远。二哥的编程星球已经有 6600 多名球友加入了,如果你也需要一个良好的学习环境,戳链接 🔗 加入我们吧。这是一个 编程学习指南 + Java 项目实战 + LeetCode 刷题 + 简历精修 的私密圈子,你可以阅读星球专栏、向二哥提问、帮你制定学习计划、和球友一起打卡成长。

两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远

欢迎点击左下角阅读原文了解二哥的编程星球,这可能是你学习求职路上最有含金量的一次点击。

最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。共勉 💪。

沉默王二
技术文通俗易懂,吹水文风趣幽默。学 Java,认准二哥的网站 javabetter.cn
 最新文章