双非本科小渣渣的字节跳动Android岗面试题分享(已拿offer,分享攒人品~)

2021年已经开幕了很久,很快就要迎来“金三银四”这个面试高潮。这是简书大佬的一篇面经分享,希望对大家有帮助。
原文地址:https://www.jianshu.com/p/c1ca59809fa

下面是博主个人基本情况还有面经。

文中附有详细的面试真题目,文末有我当时刷的面试真题还有一些对我帮助良多的复习资料,特别有用,希望也可以帮大家顺利上岸,顺便攒攒人品!


笔者的基本情况

笔者是普通家庭,学历一般,非985也非211,就是一个普通本科生应届毕业生。有过一些简单的实习,也做过一些项目经历,但个人觉得都很普通吧(所以,我能进字节我真的觉得自己特别幸运!!!)。

在面试前,我刷了很多面经、面试题,这里也把自己的面经分享给大家,当做回报社区好了,顺便攒攒人品,希望往后可以一切顺利。

面试是以远程视频的形式进行的,在牛客网里进行,界面我就不贴了,哈哈哈,比较紧张,没有截图。

首先是面试的基本流程(我不怎么会写文,这里就直接记叙文了,哈哈哈)

  • 自我介绍
  • 随后面试官问我一些基本问题
  • 后面就是根据你的简历还有前面说的内容啊来问一些针对性的问题
  • 问我有没有问题
    (差不多每一面都是这样的吧……)

PS:会问很多基本知识,像是计算机网络、操作系统、编译原理这些底层什么的,大厂好像都挺喜欢深挖,建议大家多复习一下,钻一下底层。

一面面经

不知道是不是Android部门的人比较忙或者是人手不足,面我的面试官是做 iOS 开发的,没问我太多 Android 专业相关的东西。

1、ipv6 答不上来
2、http 状态码
3、http 请求
4、https 请求过程、网络安全
5、传送大图到服务器,进度功能实现
(这里扯了很多,一开始我理解成断点续传了,后面就是给的方案是 http 每次传一部分,根据状态码是否成功来处理,后面面试官觉得这个答案不行,让我从 TCP UDP Socket 这些角度去想,我说这些实现起来就更简单了,比如TCP就双向通信之类的。。)
6、gc
7、数据库索引,b tree b+ tree
8、设计模式
9、进程间通信,我说了几个,面试官说可以说 Android 的,好得!
10、rxjava,我说我之前封装过一个 rxbus,来实现消息总线,后面我是说了下消息总线对代码的影响还是比较大的,我到后面是尽量避免这样的操作。
11、算法: 字符串匹配,返回对应 index, 我用的 HashMap 实现。

总体感觉就是,面试官大多数都是问的网络,网络不是我擅长的领域,有些别的想不起来了……

另外一个特点就是——深挖底层。不止是题目,面试官会深入一些小地方一直往下问(感觉他一直在怼我,我说一个,他就顺着往下又挖,一直挖到我完全回答不上来为止)……

不过,面试官人还是挺不错的,中途有提醒我很多东西,体验不错(我当时想的是,服务很棒,下次还来?哈哈哈,开玩笑的直接成为同事更好)。

二面面经

这一面就有些尴尬了……面试官依旧很不错,是个大佬,就是貌似他那边的网络状态不是很好。

大佬呀:我看上一面问了你网络层面比较多的问题,那我接着问了
小渣渣:……好的(我没有选择,哭了)。

  • 固定程序自我介绍
  • 技术问题

1、Http1.1 和 Http 1.0 区别
2、keepalive 作用
3、keepalive 底层实现,这块我是不清楚的,我就猜测了下给了他一个答案。
4、操作系统怎么在堆上和栈上分配内存,我不太清楚,就说了 Java 虚拟机是咋分配的,结果问了我 Java 虚拟机是咋在操作系统上分配的,对不起我不知道!(后面强调了 c 的 api,我还是母鸡啊!)
5、操作系统进程和线程
6、虚拟内存
7、虚拟内存的缓存,我不清楚,依旧给了个猜测
8、手写单例,写了双重检索的,后面问我有别的吗,我说了静态内部类实现的,问我为啥静态内部类安全。
9、Android Framework,我问是 AMS 那些的吗,面试官说那太复杂了,你说下 handler , loop吧,然后问了一些相关的问题。(感动啊)
10、广播和本地广播的区别,实现原理
11、二面问我,一面评价说你觉得 rxjava 并不好,我赶紧说不是不行,rxbus 只是 rxjava 功能的一小部分,而是消息总线这样的方案有利有弊。后面说rxbus 具体封装 ,太久远了想不起来了,然后说了 rxjava 其他的用法和优点这一类的。
12、你用 map 写个 lru 吧,我说能用 LinkedHashMap 吗,不能, 后面我说了个思路,面试官觉得不行,然后说了 LruCache 怎么实现的, LinkedHashMap 怎么实现的,我说 LinkedHashMap 是用了 HashMap,在里面维护了一个双向链表,每次访问数据的时候修改链表。后面我就打算仿写一个 LinkedHashMap 来实现,多亏面试官即使打断,这个太费时间了,就不用写了。
13、手写生产者消费者,这里面试官一边看代码一边提问题,我跟着问题修改代码,其实就是把一个比较low 的生产者消费者优化成了面试官想要的样子(面试官在这里终于笑了)。
14、锁, synchronized 和 ReenTrantLock
15、抢占式锁和非抢占式锁,ReenTrantLock 怎么实现非抢占式
16、notify 和 sleep 区别
17、onTouch 和 onClick (这个我隐约中好像被问过
……剩下的记不清了

  • 问问题环节
    Q:我想了解下相关的业务
    A:这个职位是最后统一定的,我不能告诉你
    Q: 问评价
    A: 还是不能告诉你。

同样大致问题是这些,其他的也想不起来了,这块网络操作系统混合双打(还好没有再次一直挖网络)。

这个面试官是真的很棒,是一个特别厉害的大佬(或者说这个人有丰富的面试经验,比第一面的那个要熟稔很多),他会诱导你慢慢回答,考虑很周到。

三面面经

直接上面试题吧:

  • 自我介绍
  • 技术问题开始

1、因为自我介绍时介绍了自己实习写的刷新加载的组件
2、 问我自己组件里怎么解决的嵌套滑动冲突,三个方面实现完美分发事件
3、 说 retrofit 动态***这块
4、 retrofit 动态***里面如果传的不是 interface 怎么办,这块我不清楚,我就直接说不太清楚,然后说了 retrofit 关于注解的处理
5、 注解生命周期,编译时注解解析
6、 你用过 weex,说下weex实现原理,我说我没有看过 weex 源码,但是我实现过一个动态页面渲染框架,说了下我的渲染过程和实现方案。
7、 最近想学的技术,说了音视频,但是因为准备春招放下了
8、 为什么想学,说了自己之前做一个 APP,里面播放器无法使用没认证的 Https 请求,打算自定义一个播放器,在底层处理证书这块,然后在说了下不知道这样的方案可不可行。
9、 使用 https 请求这个不难的, 我说因为我这个是自己签的,就没法认证。
10、 那你 okhttp 里面怎么认证的, 说了拦截器
11、 还有个 ConcurrentHashMap 同步方案, 然后问了 CAS
12、 环状链表
13、 TCP握手挥手

  • 反问环节
    问了下今年的怎么招聘的,凉面太多看的我很慌张。

介于面试的时候比较紧张一二三面问题可能有个别搞混了,顺序也有些打乱,有些问题可能记不清了。当然,大家面试的时候也不会遇到完全一样的问题,这些只能当做准备面试前查漏补缺的一个参考吧。

最后,第三面的面试官依然棒,虽然问题节奏很快,但是不管是态度还是提问都很有技巧也很棒。

两星期后收到了offer,终于赶在毕业前上岸了。

经验总结

其实我觉得自己属于很普通的类型,并没有很突出的地方,能够进字节有三分运气,还有七分还是靠自己的努力。

大家也不必妄自菲薄,首先要有自信,如果有想要去的大公司,一定要好好做准备,努力提升自己,让自己的能力和素质匹配得上目标公司。

我也一直相信天道酬勤,机会永远是留给有准备的人。在字节面试前我也准备了很久,刷了很多大厂面试题。

下面,我把自己面试前准备的知识点整理出来分享给大家【文中的面试真题解析和学习资料都在共享文件夹(点击此处可直达)】(密码找管理)

Java基础

  • Java Object类方法
  • HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理
  • HashMap 和 HashTable 区别
  • HashCode 作用,如何重载hashCode方法
  • ArrayList与LinkList区别与联系
  • GC机制
  • Java反射机制,Java代理模式
  • Java泛型
  • Synchronized原理
  • Volatile实现原理
  • 方法锁、对象锁、类锁的意义和区别
  • 线程同步的方法:Synchronized、lock、reentrantLock分析
  • Java锁的种类: 公平锁、乐观锁、互斥锁、分段锁、偏向锁、自旋锁等
  • ThreadLocal的原理和用法
  • ThreadPool的用法和示例
  • wait()和sleep()的区别

Java高阶

  • Java虚拟机,Java运行,Java GC机制(可达性分析法,引用计数法)
  • Java对象的完整生命周期
  • JVM内存模型
  • 进程间通信,线程间通信
  • JVM类加载机制
  • Java引用类型
  • 设计模式:除常用设计模式之外,特别的,反射机制,代理模式
  • HTTP协议和HTTPS协议
  • Socket协议,Socket实现长连接
  • TCP和UDP协议
  • HTTP协议中GET和POST的具体实现
  • 序列化和反序列化
  • 线程池的实现原理
  • 数据库基础知识:多表查询、索引、数据库事务

上面我列出来的这些都挺重要的,这些点在大佬整理的《Android面试题手册(中高级)》中都有收录,大家有需要的可以去看看。

数据结构及算法

数据结构

  • 栈和队列
  • 数组和链表,自定义一个动态数组
  • Hash表,及Hash冲突的解决
  • 二叉树
  • B+ B-树
  • 基础排序算法:重点 快排、归并排序、堆排序(大根堆、小根堆)
  • 快排的优化
  • 二分查找与变种二分查找
  • 哈夫曼树、红黑树
  • 字符串操作,字符串查找,KMP算法
  • 图的BFS、DFS、prim、Dijkstra算法(高阶技能)
  • 经典问题:海量数据的处理 (10亿个数中找出最大的10000个数 TOP K问题)

算法

  • 分治算法
  • 动态规划
  • 贪心算法
  • 分支限界法

这些点在PDF资料中也有收录,因为内容较多,是以文章链接的形式收录在《Android面试题手册(中高级)》中,【有需要或者正在准备面试的朋友可以点击此处获取】

Android基础

  • Application生命周期
  • Android Activity生命周期
  • Android Service、IntentService,Service和组件间通信
  • Activity的onNewIntent
  • Fragment的懒加载实现,参数传递与保存
  • ContentProvider实例详解
  • BroadcastReceiver使用总结
  • Android消息机制
  • Binder机制,共享内存实现原理
  • Android 事件分发机制
  • Android 多线程的实现:Thread、HandlerThread、AsyncTask、IntentService、RxJava
  • ActivityThread工作原理
  • 嵌套滑动实现原理
  • RecyclerView与ListView(缓存原理,区别联系,优缺点)
  • View的绘制原理,自定义View,自定义ViewGroup
  • View、SurfaceView 与 TextureView
  • 主线程Looper.loop为什么不会造成死循环
  • ViewPager的缓存实现
  • requestLayout,invalidate,postInvalidate区别与联系
  • AndroidP新特性
  • Android两种虚拟机
  • ADB常用命令
  • Asset目录与res目录的区别
  • Android SQLite的使用入门

Android开发高级

这些是各种原理,经典第三方库源码系列

  • 自定义LayoutManager,RecyclerView中如何自定义LayoutManager
  • VLayout实现原理,即如何自定义LayoutManager
  • Glide加载原理,缓存方案,LRU算法
  • Retrofit的实现与原理
  • OKHttp3的使用,网络请求中的Intercept
  • EventBus实现原理
  • ButterKnife实现原理
  • RxJava实现原理
  • Dagger依赖注入
  • 热修复实现原理,解决方案
  • 组件化原理和解决方案

Android系统

Android Studio编译过程

其中使用到的编译工具:

aapt、aidl、Java Compiler、dex、 zipalign

主要步骤描述:

1. 通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)
2. 处理.aidl文件,生成对应的Java接口文件
3. 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件
4. 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex
5. 通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk
6. 通过Jarsigner工具,对上面的apk进行debug或release签名
7. 通过zipalign工具,将签名后的apk进行对齐处理。

以上内容文件中也有收录,需要的进圈自取。

移动开发外围

这一块的知识比较零散和杂乱,有服务器、SpringBoot技术、Restful API开发、网络协议理解、基本的数据库技术、数据缓存技术、消息队列技术等还有混合开发(如:flutter)什么的。

最后

代码改变世界,希望大家早日成为技术大牛。从现在开始,还不晚!

下面是我刷的一些其他的题目,一个是在大佬的公众号领的,一个是在网上找的(都已经上传圈共享文件夹,需要的可以直接进圈找管理)



最后祝愿大家也能顺利拿下大厂offer,奥利给!

猜你喜欢

转载自blog.csdn.net/BUGgogogo/article/details/114271985