字节跳动Android日常实习一二三面面经(附部分回答)

大三,投了字节Android客户端的日常实习大力教育部门,Base杭州。

一面(56mins)

1.计网/操作系统

  • 线程与进程的区别

  • 进程间的通信方式

    linux的几种+安卓的几种(核心是Binder驱动,实现是内存映射)

  • https的传输过程

    非对称加密/对称加密/散列签名验证

  • 死锁的条件/实现死锁

    1.互斥原则

    2.不可剥夺条件

    3.请求与保持原则

    4.循环等待条件

  • tcp/udp(使用场景)

  • 三次握手

  • 服务器未响应如何处理/客户端故障如何处理

    超时重传/保活器

  • 拥塞控制/流量控制

    tahoe/reno的使用

  • 流量控制

    2.Android

    • 自定义View如何写

      包括自定义属性、构造函数等

    • onMeasure绘制原理/底层的默认实现方式

      父子Measure的区别

    • 三种动画

      强调补间和属性动画的区别

    • 补间动画移动之后点击是否响应/与属性动画的区别

    算法

    四个没答好的点整理

    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固定值的变式题(基于摩尔投票法)

      https://leetcode-cn.com/problems/majority-element-ii/

    没答好的点:数据库(因为没学过,不太懂)

    闲聊

    什么时候可以来实习?

    有兴趣来上海吗?

    告诉了我周三是活动周,比较轻松,部门氛围非常好

    反问

    公司对新人的培养体系

    三面(60mins)

    Java

    • hashmap

      扩容,实现原理(不同版本的差异),(若大小1000,多少扩容,头插法死循环)

    • 注解

      本质是代理模式,分三种注解,具体说明

    • 四大引用及应用场景

      最经典的就是handler+弱引用降低内存泄漏的场景

    数据库

    • 数据库的升级

    Android

    • handler原理

      四个组成及其具体实现,从源码来说,分UI现成和子线程的区别,如何主动使用looper

    • LaunchMode及其应用场景

    • 活动的生命周期,A/B活动之间的跳转,各自周期的变化

    • 如果B是透明的怎么样

    • 活动之间的数据传输

    • fragment和活动的通信

    • 内存泄漏原理/应用场景/OOM的避免

    • 设计一个图片加载器

      缓存和压缩

      缓存:设计三级缓存,包括内存缓存,本地缓存和网络缓存

      压缩:BitmapFactory.options参数来禁用内存的读入,从参数的获取来设置合适的分辨率

    结合Android知识点的项目相关

    • 滑动冲突/事件分发机制

    • RecyclerView使用

    • onMeasure()

    • 分割线的实现

    • Service后台播放音乐如何保证不被杀死

    • 单例模式

    • Glide源码

    • 活动之间的动画跳转/自定义动画

    算法

    • 已知前序、中,求后序遍历

      前序最左边为根,然后找中序的该节点,左边为左子树,右边为右子树,递归的找每个子树的根即可

    没答好的点:数据库

    闲聊

    怎么学习的?

    哪时候能来实习?

    为什么数学系会想来做客户端开发,不去做算法或者深造?

    反问

    对实习生的期待

    业务用kotlin还是Java

    三面结束收到了口头offer,很开心。

    面试完之后的感受:

    对基础的提问更多是广(基础指的是学的计算机基础课程),对自己掌握的额外知识点问的比较深(比如对我深挖了Android源码,基本上需要对源码进行大量的阅读才能熟悉并了解怎么回答),算法题难度一般是mid,hard的比较少,可能客户端要求没后端高(听我同学说他去上海业务中台部门后端问了三道hard:手撕LRU,字典树,求k个升序数组的交集);面试官人都非常不错,你不会的地方只要明确的说你不会,面试官不会为难你的,并且会去对你不熟悉的点进行一步步引导,所以通常聊天会很愉快。


#实习##面经##字节跳动##安卓工程师#
全部评论
博主强啊   ***顶爆你
2 回复 分享
发布于 2021-04-23 18:00
您好,我想问下字节的日常实习通常要求offer后多久入职呢?
点赞 回复 分享
发布于 2021-04-22 09:52
请问Andrio有学习的书籍推荐吗
点赞 回复 分享
发布于 2021-04-22 11:51
请问你面试是视频面麽,在什么平台的啊
点赞 回复 分享
发布于 2021-04-22 15:25
想请问楼主,hr面也是在牛客嘛
点赞 回复 分享
发布于 2021-06-10 20:53

相关推荐

10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
10
52
分享
牛客网
牛客企业服务