共计 4988 个字符,预计需要花费 13 分钟才能阅读完成。
根本状况
自己系非 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 怎么办?
所以我说音讯总线这些有利有弊,应该在设计上尽量避免这样的操作。
三面
- 自我介绍,介绍了本人实习写的刷新加载的组件
- 问我本人组件里怎么解决的嵌套滑动抵触,三个方面实现完满散发事件
- 说 retrofit 动静 * 这块
- retrofit 动静 * 外面如果传的不是 interface 怎么办,这块我不分明,我就间接说不太分明,而后说了 retrofit 对于注解的解决
- 注解生命周期,编译时注解解析
- 你用过 weex,说下 weex 实现原理,我说我没有看过 weex 源码,然而我实现过一个动静页面渲染框架,说了下我的渲染过程和实现计划。
- 最近想学的技术,说了音视频,然而因为筹备春招放下了
- 为什么想学,说了本人之前做一个 APP,外面播放器无奈应用没认证的 Https 申请,打算自定义一个播放器,在底层解决证书这块,而后在说了下不晓得这样的计划可不可行。
- 应用 https 申请这个不难的,我说因为我这个是本人签的,就没法认证。
- 那你 okhttp 外面怎么认证的,说了拦截器
- 还有个 ConcurrentHashMap 同步计划, 而后问了 CAS
- 环状链表
- TCP 握手挥手
问问题环节
跟二面一样的问题,顺便问了下往年的怎么招聘的,凉面太多看的我很慌乱。
一二三面问题可能搞混,程序有些打乱,有些问题可能记不清了,三面面试官仍然棒,尽管问题节奏很快,然而问题都很棒。
健忘症想起来可能还问了这些(记不起来第几面的了,大部分在第二面吧)
- 锁,synchronized 和 ReenTrantLock
- 抢占式锁和非抢占式锁,ReenTrantLock 怎么实现非抢占式
- notify 和 sleep 区别
- onTouch 和 onClick(这个我隐约中如同被问过
- 注解处理器,这个我二面三面都有扯到,因为本人实现过动静路由的简略性能
- 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
次要步骤形容:
- 通过 aapt 打包 res 资源文件,生成 R.java、resources.arsc 和 res 文件(二进制 & 非二进制如 res/raw 和 pic 放弃原样)
- 解决.aidl 文件,生成对应的 Java 接口文件
- 通过 Java Compiler 编译 R.java、Java 接口文件、Java 源文件,生成.class 文件
- 通过 dex 命令,将.class 文件和第三方库中的.class 文件解决生成 classes.dex
- 通过 apkbuilder 工具,将 aapt 生成的 resources.arsc 和 res 文件、assets 文件和 classes.dex 一起打包生成 apk
- 通过 Jarsigner 工具,对下面的 apk 进行 debug 或 release 签名
- 通过 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,共勉!