双非本科字节跳动Android面试题分享(已拿offer)

基本状况

本人系非985非211普通本科生一枚,有实习有项目经历但成绩普通,在面试前刷了不少面经、面试题,这里也把本身的分享下,作个回报好了,顺便攒攒人品,一到这种时候人就迷信起来了。前端

面试是以视频面试的形式进行的,在牛客网里进行,界面我就不贴了,没截图。vue

首先是面试的基本流程,刚开始是自我介绍。随后面试官会问你一些基本问题。接下来就是根据你的简历啊、前面说的内容啊来问一些针对性的问题,而后会问不少基本知识,像是计算机网络、操做系统、编译原理这些。java

一面

面个人面试官是作 iOS 的,就没问我 Android 的。react

一、ipv6 答不上来
二、http 状态码
三、http 请求
四、https 请求过程
五、传送大图到服务器,进度功能实现: 这里扯了不少,一开始我理解成断点续传了,后面就是给的方案是 http 每次传一部分,根据状态码是否成功来处理,后面面试官以为这个答案不行,让我从 TCP UDP Socket 这些角度去想,我说这些实现起来就更简单了,好比TCP就双向通讯之类的。。
六、gc
七、数据库索引,b tree b+ tree
八、设计模式
九、进程间通讯,我说了几个,面试官说能够说 Android 的,好得!
十、算法: 字符串匹配,返回对应 index, 我用的 HashMap 实现。android

大多数都是问的网络,网络不是我擅长的领域,有些别的想不起了。。。webpack

不止是题目,面试官会深刻进去怼的,别问我怼啥,被怼的忘光了都!git

面试官人很好,还强调了他低头是写面试评价。程序员

二面

面试官依旧很 OK,惋惜网络状态不佳。github

面试官:我看上一面问了你网络层面比较多的问题,那我接着问了
我:。。。好。
先自我介绍web

一、Http1.1 和 Http 1.0 区别
二、keepalive 做用
三、keepalive 底层实现,这块我是不清楚的,我就猜想了下给了他一个答案。
四、操做系统怎么在堆上和栈上分配内存,我不太清楚,就说了 Java 虚拟机是咋分配的,结果问了我 Java 虚拟机是咋在操做系统上分配的,对不起我不知道!(后面强调了 c 的 api,我仍是母鸡啊!)
五、操做系统进程和线程
六、虚拟内存
七、虚拟内存的缓存,我不清楚,依旧给了个猜想
八、手写单例,写了双重检索的,后面问我有别的吗,我说了静态内部类实现的,问我为啥静态内部类安全。
九、Android Framework,我问是 AMS 那些的吗,面试官说那太复杂了,你说下 handler , loop吧,而后问了一些相关的问题。(感动啊)
十、广播和本地广播的区别,实现原理
十一、你用 map 写个 lru 吧,我说能用 LinkedHashMap 吗,不能, 后面我说了个思路,面试官以为不行,而后说了 LruCache 怎么实现的, LinkedHashMap 怎么实现的,我说 LinkedHashMap 是用了 HashMap,在里面维护了一个双向链表,每次访问数据的时候修改链表。后面我就打算仿写一个 LinkedHashMap 来实现,多亏面试官即便打断,这个太费时间了,就不用写了。
十二、手写生产者消费者,这里面试官一边看代码一边提问题,我跟着问题修改代码,其实就是把一个比较low 的生产者消费者优化成了面试官想要的样子(面试官在这里终于笑了)。
1三、问问题环节
Q:我想了解下相关的业务
A:这个职位是最后统必定的,我不能告诉你
Q: 问评价
A: 仍是不能告诉你。
over

一样大体问题是这些,其余的也想不起来了,这块网络操做系统混合双打。

面试官人很棒,会诱导你慢慢回答,并且考虑很周到。

补充

好像还有个 rxjava 的问题,这里补充下

一面问我 rxjava,我说我以前封装过一个 rxbus,来实现消息总线,后面我是说了下消息总线对代码的影响仍是比较大的,我到后面是尽可能避免这样的操做。

二面问我,一面评价说你以为 rxjava 并很差,我赶忙说不是不行,rxbus 只是 rxjava 功能的一小部分,而是消息总线这样的方案有利有弊。

后面说rxbus 具体封装 ,过久远了想不起来了,而后说了 rxjava 其余的用法和优势这一类的。

后来问我不用消息总线怎么实现通讯,我说了能够用原生的方式 startActivityForResult 之类的。

跨Activity怎么办?

因此我说消息总线这些有利有弊,应该在设计上尽可能避免这样的操做。

三面

  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握手挥手

问问题环节

跟二面同样的问题,顺便问了下今年的怎么招聘的,凉面太多看的我很慌张。

一二三面问题可能搞混,顺序有些打乱,有些问题可能记不清了,三面面试官依然棒,虽然问题节奏很快,可是问题都很棒。

健忘症想起来可能还问了这些(记不起来第几面的了,大部分在第二面吧)

  1. 锁, synchronized 和 ReenTrantLock
  2. 抢占式锁和非抢占式锁,ReenTrantLock 怎么实现非抢占式
  3. notify 和 sleep 区别
  4. onTouch 和 onClick (这个我隐约中好像被问过
  5. 注解处理器,这个我二面三面都有扯到,由于本身实现过动态路由的简单功能
  6. cookie 和 session 记得没答好这个

两星期后收到了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的具体实现

  • 序列化和反序列化

  • 线程池的实现原理

  • 数据库基础知识:多表查询、索引、数据库事务

数据结构及算法

数据结构

  • 栈和队列

  • 数组和链表,自定义一个动态数组

  • Hash表,及Hash冲突的解决

  • 二叉树

  • B+ B-树

  • 基础排序算法:重点 快排、归并排序、堆排序(大根堆、小根堆)

  • 快排的优化

  • 二分查找与变种二分查找

  • 哈夫曼树、红黑树

  • 字符串操做,字符串查找,KMP算法

  • 图的BFS、DFS、prim、Dijkstra算法(高阶技能)

  • 经典问题:海量数据的处理 (10亿个数中找出最大的10000个数 TOP K问题)

算法

  • 分治算法

  • 动态规划

  • 贪心算法

  • 分支限界法

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开发

网络协议理解:TCP/IP、HTTP/HTTPS、OSI七层协议

受权认证协议: OAuth2.0 等

基本的数据库技术

数据缓存技术:Memcached、Redis,Web缓存原理

消息队列技术

监控、日志分析技术

前端开发相关

前端开发知识不少,框架层出不穷,本质的东西却只有如下这些。

核心必备:HTML、CSS、JavaScript

入门提升:浏览器兼容性、自定义UI和动效

中级技能:框架层出不穷,当前以vue.js、react.js 为核心

协做开发技能:包管理、模块化,工具采用 npm、webpack等

高级技能:框架原理源码研究

开发调试各类工具

性能分析工具:Memory Monitor

性能追踪及方法执行分析: TraceView

视图分析:Hierarchy Viewer

ApkTool- 用于反向工程Android Apk文件的工具

Lint- Android lint工具是一个静态代码分析工具

Dex2Jar- 使用android .dex和java .class文件的工具

代码改变世界,要早日成为技术大牛,程序员肩上的担子但是很重啊。趁如今开始,还不晚!

最后祝愿你也能顺利拿下大厂offer,共勉!

相关文章
相关标签/搜索