根本状况

自己系非985非211一般本科生一枚,有实习有我的项目经验但问题一般,在面试前刷了很多面经、面试题,这里也把本人的分享下,做个回报好了,顺便攒攒人品,一到这种时候人就科学起来了。

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

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

一面

面我的面试官是做 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、算法: 字符串匹配,返回对应 index, 我用的 HashMap 实现。

大多数都是问的网络,网络不是我善于的畛域,有些别的想不起了。。。

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

面试官人很好,还强调了他抬头是写面试评估。

二面

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

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

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、你用 map 写个 lru 吧,我说能用 LinkedHashMap 吗,不能, 前面我说了个思路,面试官感觉不行,而后说了 LruCache 怎么实现的, LinkedHashMap 怎么实现的,我说 LinkedHashMap 是用了 HashMap,在外面保护了一个双向链表,每次拜访数据的时候批改链表。前面我就打算仿写一个 LinkedHashMap 来实现,多亏面试官即便打断,这个太费时间了,就不必写了。
12、手写生产者消费者,这里面试官一边看代码一边提问题,我跟着问题批改代码,其实就是把一个比拟low 的生产者消费者优化成了面试官想要的样子(面试官在这里终于笑了)。
13、问问题环节
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,共勉!