投递情况
主要投递了国内和国外的互联网公司,同时也投递了一些币圈企业,最终斩获battmd offer和一币圈的百万年薪offer
关于如何准备面试,可以关注我的面试准备系列文章如何准备一场技术面试?
offer斩获情况
大大小小共12家公司offer
考点
算法:
单例的写法(我采用了双检查的写法,写完要能解释清楚为什么写volatile或者双检查)
两个线程轮流打印奇数和偶数(腾讯新闻)
生产者消费者模式,用wait和notify写出来(美团)
二分法查找(很多公司都会考)
合并两个二叉树(头条)
猴子吃桃(一次吃2个或3个桃子,总共有多少种吃法,要求非递归)(头条)
合并有序数组或者链表(很多公司都会考)
数组、字符串处理(动态规划考的比较少,最难的就是一个简单的斐波那契,都是mid和easy的数组查找或者处理)
两数之和
三数之和
搜索旋转排序数组,旋转数组的最小值(瓜子二手车)
组合总和
全排列
合并区间(网易,只说对思路即可)
二叉树的前中后序遍历非递归写法
查询链表是否是循环链表以及链表环的入口点
滑动窗口最大值(美团)
反转字符串(新浪微博)
用两个栈实现队列(知乎等一些公司考到了)
两个链表的第一个交点
剑指 Offer 53 - I. 在排序数组中查找数字 I
二叉树或者多叉树的深度
378. 有序矩阵中第 K 小的元素(visa)
总结:
国内公司考察的算法基本上在剑指offer、hot100都能找到原题(easy和mid),因此,算法面试准备以上两项即可,而且要做到能根据题意,理清自己思路,然后尽快撸码,一般都能取得一个还算不错的面试结果。
外企一般对算法的考察稍深一些,所以要扩大算法备考范围,这里可以补充——LeetCode 精选 TOP 面试题。
总之一句话:算法面试要做到对算法的原理很清楚,并且能根据算法原理作一定能力迁移,并快速给出思路,例如:二分法、字符串处理常用方法的解题能力迁移。
Java基础、原理、GVM原理篇
==和equals的区别是什么?
java都有哪些基本类型?
java注解的种类都有哪些?区别是什么?在项目当中有用过java注解吗?
static关键字的作用是什么?
final关键字的作用是什么?
经过final和static修饰的变量存放在jvm的哪个区域?
volatile的作用是什么?以及他的原理?(可能会结合双检查单例一起来考察)
jvm内存模型、栈里面的区域(讲清楚栈帧结构)
gcroot都有哪些?
为什么选定这些变量作为gcroot?
jvm虚拟机在内存回收时候都有哪些算法?
jvm的堆内存模型?以及在每一块区域中采用的内存回收算法?为什么要采用这样的回收算法?
new String()、String 修饰的变量、字符串的区别?
String、StringBuilder、StringBuffer的区别?
int和Integer的区别(注意Integer的内存溢出问题)
java 异常的实现原理是什么?
Throwable、error、exception是什么关系?分别都是什么时候用?
在一个32位或者64位处理器上运行的java程序,int占多少位?(头条面试题)
Hashmap、Hashtable、Concurrenthashmap的实现原理?
Hashmap在1.7和1.8的实现区别?
Hashmap扩容是怎么实现的?
Hashmap的put过程是如何实现的?
为什么扩容是2的n次方?
为什么要有链表转数组的过程?
红黑树原理?
Hashmap数组的0位是干什么用的?
Concurrenthashmap的实现原理(1.7和1.8区别)
数组、链表的查找和插入的实现复杂度?
java泛型的意义是什么?
java的类加载机制?双亲委派机制?
java在对象创建过程中都经历了哪些过程?
java中如何区分两个类是同一个类?
如何确定两个对象是同一个对象?(equals和hashcode)
java为什么要有内部类或者说内部类解决了什么问题?
AQS原理,在哪里应用
java一共有几种线程同步方式,区别是什么?(Reentrantlock\ReadAndWriteLock\countdownlatch\semaphone\)
java多线程:
java同步都有哪几种方法
使用syntronized修饰的方法,使用static syntronized、代码块持有的锁都分别是什么?
Wait\notify\notifyAll、lock、unlock的区别是什么?能否使用他们写出生产者消费者模式?能否写出两个线程交替打印奇偶数?
volatile的作用是什么?深入到原理层面
创建线程的几种方法?
java一共有几种线程池?
java如何自定义线程池?自定义线程池过程中的几个参数都是什么意思?
如何实现线程池监控?
线程池的核心实现原理?
线程池如何实现取消?
线程池的核心线程和非核心线程是固定不变的吗?(在修改相应参数时候可能会变化)
如何区分线程和进程?
Kotlin基础和高阶应用
kotlin中== 和===的区别?
kotlin中foreach和loop区别?
kotlin泛型中in,out、refield的作用?
inline、outline、crossline的作用?
kotlin的高阶函数如何理解?
kotlin协程的几种实现方式?
协程的原理?(没人问过,作为一个了解)
jetpack了解吗?livedata、lifecycle的原理都是什么?
Kotlin data sealed类的区别?
Object companionObject的区别和应用
Let with also run apply 区别
Android基础
activity启动模式?几个activity的启动模式混合相互启动时候的生命周期都是怎么样的?
activity生命周期?
android进程间通信方式?
binder的实现原理?
Contentprovider实现原理?
service想要实现进程间通信如何实现?
如何创建多进程?
Okhttp原理?(会结合网络请求过程中的缓存比如etag、过期时间等来问。会问到调度器原理,连接池,多准备源码细节)
Eventbus、Butterknife实现原理?
Rxjava实现原理?
fragment的生命周期?fragment切换时候的生命周期?
自定义view如何设计?需要从继承view开始从头设计(onmeasure\onlayout\ondraw)
事件传递机制?
onIntercepttouchevent之后是如何将后续事件都发送到ontouch中的?
view的绘制原理?(描述view.invalidate之后的过程)
做过性能优化吗?(描述滴滴的webview优化过程、掌握常见的性能优化手段)
activity启动过程,一般结合插件化原理解释,要尽量解释详细。
handler实现原理?
handler发生内存泄漏的原理?(一定要弄清楚,很多公司都有问到)
Android中常见的发生内存泄漏的场景?
aidl的使用和原理?
contentprovider的使用及其原理?
socket在android中的使用场景?
进程保活做过吗?都有哪些手段?
性能和优化
线上如何监控卡顿,ANR?
做过性能优化吗?介绍一下具体做法
业务侧有线程池,集成的sdk里也有线程池,如何对这些线程池做管理?
设计模式
常见的设计模式,要能知道每一种设计模式的优缺点。
单例模式,要能快速并且准确的写出。
建造者模式,为什么要使用建造者模式,建造者模式解决了什么问题?有什么优缺点?
工厂模式和抽象工厂模式的区别。
享元模式的应用及解决了什么问题。
谈谈MVC,MVP,MVVM区别
网络
缓存的时候都需要加哪些字段
Tcp\Ip三次握手和四次挥手,为什么要三次握手和四次挥手
网络优化做过吗?讲一下常用的网络优化手段。
结合glide讲一下缓存。
讲一下http和https的区别
项目
push到达率从90%提升到95%?
侧边栏缓存优化都是怎么做的?
拓展
讲一下你的优缺点?
为什么换工作?或者为什么选择在现在这个节点换工作?