字节和腾讯面试的过程和感想记录(已有offer)

详情阅读Rxjava源码解析

  • 3.你项目中高度自定义了DiskLRUCache。问LRUCache的实现?问LinkedHashMap的实现?问DiskLruCache的实现?问Glide中实现的DiskLruCache的运用。

  • 4.Handler的原理

文章:

简答:偏向锁转化瘦锁(owner thread id不一致且没上锁),瘦锁转化胖锁(64次获取不到锁后)。

  • 7.ReentrantLock 实现。

简答:由AQS(AbstractQueuedSynchronizer)实现。ReentrantLock 分为公平锁和非公平锁。AQS本质上是调用acquire 时候为本线程添加到同步队列中,每一个线程代表一个Node,在每个Node会自旋竞争同步队列中的状态。公平锁需要多一个判断,就是保证自己是头节点。

  • 8.ui 优化,首屏渲染时机优化

  • 9.启动优化,与AlphaManager的实现。

  • 10.插桩的原理以及运用。

  • ASM

  • Javapoet

  • 动态代理

  • 11.LiveData 和 ViewModel的源码实现

  • 12.x2c 源码实现

  • 13.DNS 原理

  • 14.https的原理

13和14可以阅读 :Android网络编程 总览

  • 13.算法:判断一个字符串是否是回文串(注意保证原字符串不可改变,可用O(n)的空间复杂度)。

方向:栈的考究。

字节3面 Leader面

  • 1.工作软技能的考核,以及团队中的定位

  • 2.如何进行io 优化,指标是什么,优化后的结果以及参数是多少?

方向:可以使用/proc/pid/stat读取cpu的idle,iowait等。使用mmap优化后的结果。

  • 3.算法:在一个单链表中,每k个节点进行反转,无法被反转的部分放在末尾。

腾讯面试

腾讯的面试风格,普遍是基于你的简历上项目经历,往细节往深处问。我是面试因算法失败了一次,后面第二次就成功了。

总结一下2次腾讯面试

腾讯第一次面试1面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.ARouter 源码实现,项目中对ARouter的扩展实现详细设计

  • 3.ui 优化,启动优化,首屏展示时机优化

  • 4.volidate 实现

  • 5.Java异常捕获

  • 13.DNS 原理

  • 14.https的原理

  • 6.jni 中JNIEnv 和线程的关系

简答:线程私有,需要JavaVm 重新获取一个jnienv 调用attachThread 方法把线程和新的JNIEnv 绑定起来。

  • 7.jni中有几种注册native方法。

简答:2种,动态和静态。关于整个流程中关键的数据结构之间的关系可以看下面这篇文章的流程图: JVM引擎执行总结

  • 8.Native异常捕获

简答:通过sigaction保存系统默认的处理信号方式,sigaddset 保证一次只关心一种信号,sigaction 设置自定义的信号处理方法。在自定义的信号处理方法中,进行unwind_backtrace 处理,通过_Unwind_GetIP获得native栈信息保存起来,并抛出异常。同时 当前方法地址 和 so的地址获取 相对地址,最后通过addr2line 解析 出是so库中哪一个方法。

腾讯第一次面试2面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.ARouter的实现,以及自定义扩展ARouter的实现

  • 3.项目中的io 优化,以及为什么用mmap于io优化

  • 4.mmap的实现

  • 5.mmkv 中 对应 mmap 断电时候的处理机制

  • 6.mmap没调用msync时候,落盘时机。

简答:进程死亡

详情看

因为自己画蛇添足,把每一个节点拷贝了一次,还没有往后迭代,实在是错漏百出就挂了。脑袋还是不够清醒,结果饮恨而归。

腾讯第二次面试1面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.ARouter 的实现,以及扩展的实现

  • 3.启动优化,以及ARouter的启动优化方式,ARouter的分区方式

  • 4.Navigation的源码解析

  • 5.基于Navigation 编写路由框架NavigationRouter 的源码实现,以及实现的优点

  • 6.Navigation 实现的路由框架中如何处理Activity和Fragment 嵌套启动的方式

  • 7.class的加载流程

文章:class 文件初识

  • 8.Handler的实现

文章:

最好能回答到epoll和eventfd的层面

  • 9.实现一个多线程下的消费者生产者模式

腾讯第二次面试2面

  • 1.自我介绍,项目经历,项目上的优化项以及原因

    1. io 优化 与 使用mmap的优势和缺点
  • 3.ARouter 的实现,以及扩展的实现

  • 4.多进程实现的路由

  • 5.如何进行多进程的同步调用,此时另一个进程还没有启动?

参考答案:横向浅析Small,RePlugin两个插件化框架 中,RePugin是如何通过CP 进行跨进程同步通信

  • 6.数据结构中不支持多线程的数据结构,如果使用多线程操作会造成什么结构

简答:如HashMapArrayMap等不支持多线程保护原子性的数据结构。每一次进行put,get操作的时候,都会对modCount 加一。用于记录当前操作次数。一旦看是遍历里面的元素,会不断检查该操作前保存的modCount 是否和之前的一致。不一致则抛出ConcurrentModificationException

  • 7.ArrayMap 实现

简答:ArrayMap 是内存优化的数据结构。核心是由两个数组组成的数据结构。第一个数组记录了key对应的hashCode,这个过程会不断的通过二分法找到hashCode合适的插入位置。获得的index,index左移动1位是key缓存的位置,index左移动1位加1则是value的缓存位置。

ArrayMap中的存在一个静态数组,用来保存大小4/8 开辟过的ArrayMap。如果使用该大小的ArrayMap 则直接使用缓存。

ArrayMap的扩容,当存储的数据大小大于等于hash存储的数组大小则扩容,小于4扩容位4,大于4小于8扩容成8,如果大于8则扩容成原来的1.5倍。

每一次remove 发现是存储的数据是当前容器大小的1/3,则压缩一半。

  • 8.HashMapArrayMap比较,两者的优缺点

简答:

  • 数据结构上:

  • 1.ArrayMap 是两个数组组成的是为了内存优化而生;

  • 2.HashMap 采用数组+链表+红黑树

  • 内存优化:

  • ArrayMap 更加节省内存,因为是一个内存中连续开辟的数组,不易产生内存碎片

  • HashMap 以entry的方式保存key和value,对内存的利用率低

  • 性能上:

  • Arraymap 查找时间是O(logN) 级别(二分法),删除和增加成员需要移动成员,速度慢,小于1000的情况下没有区别

  • HashMap 增删的时间复杂度就是O(1)

  • 缓存机制:

  • ArrayMap 针对大小4和8的都有缓存。避免频繁GC,两个缓存池的大小上线为10

  • Hashmap 没有缓存

  • 扩容机制:

  • ArrayMap是在容量满的时机触发容量扩大至原来的1.5倍,在容量不足1/3时触发内存收缩至原来的0.5倍,更节省的内存扩容机制

  • HashMap是在容量的0.75倍时触发容量扩大至原来的2倍,且没有内存收缩机制。

  • 9.handler 的原理

  • 10.handler 是怎么进行postDelay 延时操作。

简答:postDelay 会将延时+当前的时间戳,插入到MessageQueue的合适位置。每一次消费判断时间到达延时的时间点,再进行消费。

  • 11.当handler 只有一个延时的message时候,Looper中是如何运行。

简答:通过pollOnce 调用epoll 进行阻塞。

  • 12.volidate 原理

  • 13.当没有添加volidate 修饰属性的时候,数据什么时候从缓存行刷新到主存。

简答:当从synchronized 代码域离开的时候;当线程结束时候;当调用synchronized 方法;当第一次访问线程的某个属性。

文章:线程的缓存何时刷新?

  • 14.算法题:在一个n*n的方格中。有两种方格,1代表阻塞不能经过,0代表可达。两点坐标,a和b。问a到b的最短路径。

腾讯第二次面试3面和4面

腾讯3面和4面是联系到一起的,这里一起说了

  • 1.自我介绍,项目经历,项目上的优化项以及原因

  • 2.mmap 实现原理和io优化

  • 3.View的绘制流程,从 setContentView 解析xml到View的绘制结束。

设计的内容极多和广泛,建议看我写的如下系列文章:

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

w的绘制流程(五) onDraw]( ) onDraw")

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

[外链图片转存中…(img-VHmJuZXZ-1714681768489)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值