字节跳动Android日常实习一二三面面经(附部分回答)
大三,投了字节Android客户端的日常实习大力教育部门,Base杭州。
一面(56mins)
1.计网/操作系统
#实习##面经##字节跳动##安卓工程师#
线程与进程的区别
进程间的通信方式
linux的几种+安卓的几种(核心是Binder驱动,实现是内存映射)
https的传输过程
非对称加密/对称加密/散列签名验证
死锁的条件/实现死锁
1.互斥原则
2.不可剥夺条件
3.请求与保持原则
4.循环等待条件
tcp/udp(使用场景)
三次握手
服务器未响应如何处理/客户端故障如何处理
超时重传/保活器
拥塞控制/流量控制
tahoe/reno的使用
2.Android
自定义View如何写
包括自定义属性、构造函数等
onMeasure绘制原理/底层的默认实现方式
父子Measure的区别
父类MeasureSpec决定子View MeasureSpec的方式
应该从ViewGroup的源码出发,分析measureChildren的实现过程
service启动/生命周期
stop和unbind的区别
三种动画
强调补间和属性动画的区别
补间动画移动之后点击是否响应/与属性动画的区别
算法
四个没答好的点整理
1.死锁产生的条件(忘了,但是撕了一个死锁的实现)
互斥条件
循环等待条件
不可剥夺条件
请求与保持原则
参考:https://blog.csdn.net/wljliujuan/article/details/79614019
2.流量控制(答的不清楚,强调安全性去了,没答到点上)
为了防止发送方发送数据的速率过快,通过接收方发送的接受窗口大小来控制发送方传输的数据量,达到预防拥塞的效果
参考:https://www.cnblogs.com/wxgblogs/p/5616829.html
3.父类MeasureSpec如何确定子View模式(看源码)
决定方式为父亲和子类共同:
父:AT_MOST+size:如果子类是确定的量,则为EXACTLY+size,如果为MATCH_PARENT或者WRAP_PARENT,则为AT_MOST+size
父:EXACTLY+size:如果子类是确定的量,则为EXACTLY+childSize,如果为WRAP_PARENT,则为AT_MOST+size,若是MATCH_PARENT,则为EXACLTY+size
父:UNSPECIFIED+size:如果子类是确定的量,则为EXACTLY+chileSize,如果为MATCH_PARENT或者WRAP_PARENT,则为UNSPECIFIED
参考:https://www.jianshu.com/p/d16ec64181f2
4.Service中调用stopService和unBindService的先后区别(有点细节,现在懂了)
在混合启动时,先调用unBindService会接触绑定,但是服务仍在,因为还未暂停服务
先调用stopService,此时不会暂停服务,因为还存在绑定的服务项目,只有当解除所有绑定之后才能结束服务onDestory()
扩展:如何保证后台服务不被杀死:先startService再bindService,当且仅当stopService和unBindService都调用时服务才会被销毁,否则不会被销毁。(Android8.0之后规定了不能存在隐身的应用程序,所以这时候应该在通知栏展现)
反问
你在公司一天具体干什么
二面(25mins)
Java
Java内存结构(和内存模型JMM要区别开来)
Gc相关都说一次
Android
Bitmap的存储位置
结合具体情况,LRU的使用
数据库
数据库的索引
算法
给定一列数组(长度为n),和一个k值,求数组中数字出现次数大于n/k的所有值的集合
感觉这题不太好做,我手撕的时候是用Hashmap存储Key为数字,value为次数,但是这样一个case都过不了,看了网上的解析是要将Hashmap大小固定为k(因为结果必不可能超过k,否则k*(n/k)=n了),然后超过k的把所有保存在Hashmap中的值减1,最后检查所有符合的值
leetcode有一道k=3固定值的变式题(基于摩尔投票法)
没答好的点:数据库(因为没学过,不太懂)
闲聊
什么时候可以来实习?
有兴趣来上海吗?
告诉了我周三是活动周,比较轻松,部门氛围非常好
反问
公司对新人的培养体系
三面(60mins)
Java
hashmap
扩容,实现原理(不同版本的差异),(若大小1000,多少扩容,头插法死循环)
注解
本质是代理模式,分三种注解,具体说明
四大引用及应用场景
最经典的就是handler+弱引用降低内存泄漏的场景
数据库
数据库的升级
Android
handler原理
四个组成及其具体实现,从源码来说,分UI现成和子线程的区别,如何主动使用looper
LaunchMode及其应用场景
活动的生命周期,A/B活动之间的跳转,各自周期的变化
如果B是透明的怎么样
活动之间的数据传输
fragment和活动的通信
内存泄漏原理/应用场景/OOM的避免
设计一个图片加载器
缓存和压缩
缓存:设计三级缓存,包括内存缓存,本地缓存和网络缓存
压缩:BitmapFactory.options参数来禁用内存的读入,从参数的获取来设置合适的分辨率
结合Android知识点的项目相关
滑动冲突/事件分发机制
RecyclerView使用
onMeasure()
分割线的实现
Service后台播放音乐如何保证不被杀死
单例模式
Glide源码
活动之间的动画跳转/自定义动画
算法
删除倒数第k个节点
LeetCode原题
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
已知前序、中,求后序遍历
前序最左边为根,然后找中序的该节点,左边为左子树,右边为右子树,递归的找每个子树的根即可
没答好的点:数据库
闲聊
怎么学习的?
哪时候能来实习?
为什么数学系会想来做客户端开发,不去做算法或者深造?
反问
对实习生的期待
业务用kotlin还是Java
三面结束收到了口头offer,很开心。
面试完之后的感受:
对基础的提问更多是广(基础指的是学的计算机基础课程),对自己掌握的额外知识点问的比较深(比如对我深挖了Android源码,基本上需要对源码进行大量的阅读才能熟悉并了解怎么回答),算法题难度一般是mid,hard的比较少,可能客户端要求没后端高(听我同学说他去上海业务中台部门后端问了三道hard:手撕LRU,字典树,求k个升序数组的交集);面试官人都非常不错,你不会的地方只要明确的说你不会,面试官不会为难你的,并且会去对你不熟悉的点进行一步步引导,所以通常聊天会很愉快。