大家好,我是阿秀。
oppo和vivo号称"手机届的蓝绿双厂",这两家的发展轨迹有点相似,其早期骨干都是出自步步高,虽然在国内市场一线城市一般,名声不响,比不上华为小米苹果这些,但在二三线城市,尤其是乡镇下沉市场和国外很火,尤其是非洲老铁很喜欢这两家的手机。
这段时间两家前后相继开奖了,据牛客网及脉脉上的帖子反映,vivo的offer薪资普遍不符合25届的应届生预期,很多人都认为17k/月的薪资是"劝退价",觉得"低的离谱"。
甚至有些人前脚被告知vivo开奖,后脚就打算拒了,哪怕是SSP也不打算接。
根据前几届同学的反馈来说,蓝绿双厂基本入职即巅峰,而且存在加班严重,内卷成风的情况。这里整理总结了vivo今年的校招薪资,分享一下:
白菜价:17k * 15 + 1.5k * 12,总包 27.3 w SP:20k * 15 + 1.5k * 12,总包 31.8 w SSP:23k * 15 + 1.5k * 12(部分有3-5w签字费),总包 36.3w左右
这里分享一下一位同学的 vivo Java 后端的二面面经,面试时间在 50 分钟左右,主要集中在Java基础知识、操作系统、计算机网络、Redis等方面,问题数量不多,且较为基础。
奇怪的是面试官也没问项目,最后让写了两个算法题就结束了。
Java
1、有哪些常见的垃圾回收器,举几个说说?
Serial收集器:单线程的垃圾回收器,使用标记-复制算法,适合小型应用程序或客户端应用程序。
Parallel收集器:多线程的垃圾回收器,使用标记-复制算法,适合在后台运行的中型应用程序。
CMS收集器:并发垃圾回收器,使用标记-清除算法,适合对响应时间有要求的中型应用程序。
G1收集器:并发垃圾回收器,使用标记-整理算法,适合对响应时间有要求且堆内存较大的应用程序。
2、Java线程的生命周期有了解吗?
Java线程的生命周期可以分为以下五个状态:
新建状态(New):当线程对象被创建后,它就处于新建状态。此时它并没有启动,也没有分配CPU资源。 就绪状态(Runnable):当调用线程的start()方法后,线程进入就绪状态。此时,JVM会为该线程分配必要的系统资源,但是还没有将该线程加入到运行队列中。 运行状态(Running):当线程获得CPU资源后,就进入了运行状态。在运行状态下,线程会不断地执行run()方法中的代码。 阻塞状态(Blocked):当线程在执行run()方法时,如果遇到了某些原因导致无法继续执行run()方法中的代码,那么该线程就会进入阻塞状态。在阻塞状态下,线程不会占用CPU资源。 死亡状态(Terminated):当线程执行完毕或者因异常而终止时,该线程就会进入死亡状态。在死亡状态下,JVM会回收该线程所占用的系统资源。
3、JVM内存分区中对内容主要是用来做什么的?
堆内存是垃圾收集器管理的主要区域,堆内存可以细分为:老年代、新生代(Eden、From Survivor、To Survivor)。
4、讲讲HashMap的扩容机制?
当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进入扩容阶段。
在扩容阶段,HashMap会重新创建一个新的数组,然后将原来的元素复制到新数组中。
如果原来的元素个数小于等于负载因子乘以当前容量,那么HashMap就不会进行扩容。
Java 8:在Java 8中,HashMap的扩容机制做了一些调整。默认情况下,HashMap的初始容量是16,每次扩容是将容量扩大为两倍。
而且HashMap的容量要时刻保持2的幂次方,因为我们计算出hashcode之后,还要对它进行取模运算,所以容量必须是2的幂次方。
操作系统
5、线程与进程的比较或者说区别?
1、线程比进程启动速度快,轻量级
2、进程的系统开销相较于线程而言更大
3、线程使用有一定难度,需要处理数据一致性问题;进程则无需考虑这个问题
4、同一线程共享的有堆、全局变量、静态变量、指针,引用、文件等,而独自占有栈
6、如果出现多个线程竞争怎么解决?
线程竞争(race condition)是一个常见的问题,当多个线程尝试同时访问和修改共享数据时,就可能发生。
以下是一些解决线程竞争的常见方法:
1、互斥锁(Mutex):使用互斥锁是防止多个线程同时访问共享资源的常见方法。当一个线程获取锁时,其他线程必须等待直到锁被释放。
2、读写锁(Read-Write Lock):如果共享资源的读操作远多于写操作,可以使用读写锁。它允许多个读线程同时访问资源,但写操作是排他的。
3、原子操作:对于简单的数据类型,可以使用原子类型和原子操作来保证操作的原子性,从而避免竞争条件。
此外,还有条件变量、信号量(Semaphore)以及避免共享等多种方式,解决线程竞争问题。
计算机网络
7、说下OSI 的七层模型的主要功能?
物理层:底层数据传输,如网线;网卡标准。 数据链路层:定义数据的基本格式,如何传输,如何标识;如网卡MAC地址。 网络层:定义IP编址,定义路由功能;如不同设备的数据转发。 传输层:端到端传输数据的基本功能;如 TCP、UDP。 会话层:控制应用程序之间会话能力;如不同软件数据分发给不同软件。 表示层:数据格式标识,基本压缩加密功能。 应用层:各种应用软件,包括 Web 应用。
8、TCP和UDP的使用场景有哪些?举例说说
TCP和UDP是两种常用的传输协议,它们分别适用于不同的网络通信场景。
TCP协议可靠性较高,适用于数据传输的可靠性要求较高的场景,例如传输大文件或需要确保所有数据都能到达接收端的应用,如FTP、HTTP等应用程序。
UDP协议则适用于对实时性要求较高的场景,例如音视频流媒体、在线游戏等 。
9、TCP是全双工还是半双工?
TCP是全双工协议,双方可以同时通信,所以发送方接收方各自维护一个发送窗和接收窗。
发送窗:用来限制发送方可以发送的数据大小,其中发送窗口的大小由接收端返回的TCP报文段中窗口字段来控制,接收方通过此字段告知发送方自己的缓冲(受系统、硬件等限制)大小。 接收窗:用来标记可以接收的数据大小。
Redis
10、单线程的Redis为什么这么快?
主要是有三个原因:
Redis的全部操作都是纯内存的操作 Redis采用单线程,有效避免了频繁的上下文切换; 采用了非阻塞I/O多路复用机制。
11、缓存中常说的热点数据和冷数据是什么?
其实就是名字上的意思,热数据就是访问次数较多的数据,冷数据就是访问很少或者从不访问的数据。
需要注意的是只有热点数据,缓存才有价值 对于冷数据而言,大部分数据可能还没有再次访问到就已经被挤出内存,不仅占用内存,而且价值不大。
数据更新前至少读取两次,缓存才有意义。这个是最基本的策略,如果缓存还没有起作用就失效了,那就没有太大价值了。
算法
力扣原题:四数之和、平衡二叉树,都是很经典的题,稍加思索就写出来了
反问
问了下业务和加班情况,额,只能说面试官很实诚哈哈哈。
你好,我是阿秀,普通学校毕业,校招时拿到字节跳动SP、百度、华为、农业银行等6个互联网中大厂offer,这是我在校期间的编程学习之路,详细记录了我是如何自学技术以应对第二年的校招秋招的。
毕业后我先于抖音部门担任全栈开发工程师,目前在上海某外企带领团队继续从事全栈开发,负责的项目已经顺利盈利300w+。在研三那年就组建了一个阿秀的学习圈,一直持续分享校招/社招跳槽找工作的经验,都是自己一路走过来的经验,目前已经累计服务超过 4000 +人,欢迎点此了解一二。