点击关注公众号,Java干货及时送达
这段时间互联网公司里开奖的有很多,比如小米、oppo、vivo、深信服等,但大厂开奖的却没几个,不过就在昨天貌似字节也开奖了,一时间,牛客网、脉脉、offershow上都充满了薪资爆料的帖子。
总体来说,字节跳动25届的薪资跟24届差别不大,有轻微上涨,但不少网友都打算拒了,原因不外乎工作压力大
,性价比略低
等。
其实字节今年的薪资不算低,但奈何隔壁京东今年实在太财大气粗了。
以前都说校招生薪资倒挂前一届的学长学姐,结果京东今年直接贴脸开大,今年部分应届生的offer直接倒挂高两个等级的 leader ,试想一下如果你是leader,手下刚来的应届生小兵比你工资都高,干着心里肯定不是味儿。。。
这里简单总结了一些具体代表性的薪资汇总,分享一下。
需要说明的是字节的offer一向都有房补的补充,根据城市的不同,每月房补从500-1500不等。比如阿秀在字节的时候,因为base在上海,房补是1000/月,而有的同事base在重庆,房补就变成了500/月,据说在北京的房补标准则是1500/月。所以下列offer中每个都有房补,就不再一一赘述了:
测开白菜:23k x 15 + 3w签字费 ,总包34.5w 客户端开发SSP:32k x 15 + 9w签字费 + 房补,总包48w,可选期权方案 后端开发大白菜:26k x 15 + 1w签字费,总包39w,可选期权方案 后端开发SSP:32k x 15 + 9w签字费,总包48w,可选期权方案 算法岗SSP:36k x 15 + 12w签字费,总包54w,可选期权方案 产品SP:22k - 24k x 15,总包 33 - 35w
这里分享一位读者的字节一面面经投稿,整体偏向于基础,可以看出面试官着重考查知识广度而非深度,除了Golang,还考察了操作系统、计算机网络、MySQL、Redis、设计模式、算法等。
Golang
1、说下你怎么学习Golang的,看过哪些资料?
最开始是跟着B站上的某家培训机构的Golang入门课学的,后来断断续续看过《Go语言圣经》、《Go Web开发》、《Effective Go》、《Go语言设计与实现》等。
2、你还看过《Go语言设计与实现》啊,那我问个书里的问题,Golang是如何做内存管理的?
Golang的内存管理基于tcmalloc,Go语言的内存分配器的核心设计思想是:多级内存分配模块,减少内存分配时锁的使用与系统调用;多尺度内存单元,减少内存分配产生碎片。
Golang的内存管理实现主要涉及以下几个方面:
内存分配器(malloc)和释放器(free):Golang使用tcmalloc作为其默认的内存分配器,它是一个高效的内存分配器,可以减少内存碎片。在Go语言中,可以使用内置函数malloc和free来分配和释放内存。
垃圾回收机制:Golang使用并发标记清除算法(Concurrent Mark Sweep,CMS)作为其默认的垃圾回收机制。CMS是一种高效的垃圾回收算法,可以在不阻塞用户线程的情况下进行垃圾回收。
内存池技术:Golang使用内存池技术来提高内存分配和释放的效率。内存池是一种预先分配一定数量内存的技术,可以避免频繁地调用系统函数分配和释放内存,从而提高程序的性能。
大对象支持:Golang支持大对象,即超过1MB的对象。为了支持大对象,Golang使用了一种称为“可变大小数组”的数据结构,它可以在运行时动态调整数组的大小。
Golang的内存管理实现非常高效和灵活,可以满足各种不同场景下的需求。
计算机网络
3、五层协议中的网络层知道哪些协议?
4、可以,问一个跟IP协议有关的,TTL知道是什么吗?
TTL是生存时间,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值,具体的做法是把该TTL的值减1,然后再将IP包转发出去。
如果在IP包到达目的IP之前,TTL减少为0,路由器将会丢弃收到的TTL=0的IP包并向IP包的发送者发送 ICMP time exceeded消息 。
操作系统
5、了解条件变量吗?和互斥锁有什么区别?
互斥锁一个明显的缺点是只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,他常和互斥锁一起使用,以免出现竞态条件。
当条件不满足时,线程往往解开相应的互斥锁并阻塞线程然后等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。
换句话说,互斥锁是线程间互斥的机制,条件变量则是同步机制。
6、你随便说说进程和线程的区别吧?
1、线程比进程启动速度快,轻量级
2、进程的系统开销相较于线程而言更大
3、线程使用有一定难度,需要处理数据一致性问题;进程则无需考虑这个问题
4、同一线程共享的有堆、全局变量、静态变量、指针,引用、文件等,而独自占有栈
MySQL
7、未提交读和提交读有什么区别?举例说明一下。
未提交读
事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数A原来50修改为100,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是50,但是另一个事务看到的A是100.可能会导致脏读、幻读或不可重复读
提交读
对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A原来是50,然后提交修改成100,这个时候另一个事务在A提交修改之前,读取的A是50,刚读取完,A就被修改成100,这个时候另一个事务再进行读取发现A就突然变成100了;可以阻止脏读,但是幻读或不可重复读仍有可能发生
8、为什么MySQL索引使用B+树而不用B树?
B+树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),所以同样大小的节点,B+树相对于B树能够有更多的分支,使得这棵树更加矮胖,查询时做的IO操作次数也更少一些。
Redis
9、单线程的Redis为什么这么快?
1、Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构,因此 Redis 瓶颈可能是机器的内存或者网络带宽,而并非 CPU,既然 CPU 不是瓶颈,那么自然就采用单线程的解决方案了;
2、Redis 采用单线程模型可以避免了多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且也不会导致死锁问题。
3、Redis 采用了 I/O 多路复用机制处理大量的客户端 Socket 请求,IO 多路复用机制是指一个线程处理多个 IO 流,就是我们经常听到的 select/epoll 机制。
简单来说,在 Redis 只运行单线程的情况下,该机制允许内核中,同时存在多个监听 Socket 和已连接 Socket。内核会一直监听这些 Socket 上的连接请求或数据请求。
一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。
设计模式
10、使用Golang语言写一个线程安全的单例模式?注意,是线程安全的!
package main
import (
"fmt"
"sync"
)
type Singleton struct {
name string
}
var instance *Singleton
var once sync.Once
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{name: "Singleton Instance"}
})
return instance
}
once
变量是一个sync.Once
类型,它确保了初始化代码块只被执行一次。当第一次调用GetInstance
时,once.Do
会执行初始化代码块,创建单例对象,之后的调用都会直接返回已经创建的实例。
算法
11、时间也不早了,你写一下快速排序
略,很常见的算法考察题目了。
宝子们,小编给大家安排福利了~
你喜欢本次推文吗?欢迎各位评论区聊一聊 留言抽 3位 家人,赠送8.88元现金红包!
↓ 分享、在看与点赞
至少我要拥有一个吧
宝子们,小编给大家安排福利了~
你喜欢本次推文吗?欢迎各位评论区聊一聊 留言抽 3位 家人,赠送8.88元现金红包!
↓ 分享、在看与点赞
至少我要拥有一个吧