个人自我介绍
鄙人出生于南方小乡镇,为了走出小镇,在当地够拼够努力,不是自夸,确确实实也算得上“别人家的小孩”,至少在学习这件事情少,没有要家里人操过心。
高考特别顺利,一个老牌985,具体哪个学校就不说了,不想给母校丢脸。毕业后,也算是“风光”地进入了理想公司,不说是龙头,但在当时不算差吧,那个时候算是一线。拿到offer那一刻是激动的,但没想到我人生的转折点也从此刻开始。
进入这家互联网公司后后,工作顺利,但也正因为太顺利,由顺利变成了安逸,基本上没想太多事,正因如此,也没有为自己的后来考虑,脑海里的职业规划一下子就模糊了不少。
后续
后果可想而知,在这家公司待了2年,自身技术更新不及时,加上恰巧碰到互联网环境遇冷,被裁了。公司伙食很好,待遇也不错,行业内口碑也非常nice,公司以生产精品为荣,但最终还是败给了资本,连最值钱的电商业务也卖掉了。
离开是新的开始?
被裁之后,算是对杭州心灰意冷,离开的那天,天也灰蒙蒙的,我非常清楚自己在这座城市生存的自信力已经被摧毁掉了,唯一的解决办法,就是换一个城市生活。没有太多犹豫的,毅然决然买了高铁票去了深圳,或许这座生命力旺盛的一线城市能够给我带来不一样的开始。
“理想很丰满,现实很骨感”这句话没想到我也能够派上用场,很显然,初入深圳的我并不顺利,经历裁员风波被消磨掉的自信心,一线城市的陌生感和距离感,没有朋友和家人的孤独感,同时袭来差一点就完全压垮了我。
近年来的安逸工作状态,让我的技术没有一点长进,我自知这个状态下去想要进到互联网头部公司定是不现实的,毕竟学历不能代表全部,技术才是最重要的。最后也是重新振作起来,梳理自己的技术知识,大胆的去尝试各种大厂面试,最终也是拿下字节的Offer,以下是我这些年来所经历的面试题,分享给大家了。
常规面试题
Android面试题
- ListView 如何缓存的?
- RecyclerView联系人列表如何实现A-Z快速定位
- 广播和EventBus的区别
- 主线程Looper循环为什么没有卡主线程?nativePollOnce
- SharedPreference的线程安全、进程安全,如何跨进程
- Android 中实现多线程: threads, Handler, AsyncTask, IntentService
- Android 中如何实现多进程
- 自定义View的过程:measure,layout,draw
- LayoutInflater#inflate 的 attrachToParent true 是什么意思
- theme 和 style 有什么区别,优先级
- 有哪些进程间通信方式
- View 的渲染过程
- Binder 的原理和优势
- AIDL 中的 oneway 有什么用,方向标签 in、out、inout 是什么意思
- Android 中有哪些动画,都说下
- Serializable 和 Parcelable 的区别
- 你知道哪些Layout,ConstraintLayout 的特点是什么
- 手机开发者选项有哪些,不保留活动是什么
- 基本的数据类型有哪些?
- String、StringBuilder、StringBuffer的区别?
- Fragment是什么,使用场景和生命周期
- 说一下Context和内存泄露
- 线程创建的方法?
- Activity的启动模式和适用场景?
- ViewPager用过吗?然后扯到了它和Fragment联合;
内存泄露和内存溢出说一下
(1)内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
(2)内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
内存溢出的原因及解决方法
(1)内存溢出原因:
①内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
②集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
③代码中存在死循环或循环产生过多重复的对象实体;
④使用的第三方软件中的BUG;
⑤启动参数内存值设定的过小
(2)内存溢出的解决方案:
①第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
②第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
③第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
垃圾回收机制说一下?
四大组件
- 当内存不足时Service被杀死了,如何重启这个Service
- Android系统杀进程时,是怎么考虑进程优先级的?
- Fragment 的 ViewModel 如何访问到 Activity 的 ViewModel 的数据
- Activity 4种启动模式说下,各种启动模式适合的应用场景
- Activity 任务栈从底到顶为 A-B-C,低内存杀死进程后,重新点击,显示哪个?这时如果C里面有Fragment是怎样恢复的?
- Activity如何传参给Fragment?为什么用setArgument传参,而不是使用带有参数的构造器?
- window、view 和 Activity 的关系
- Activity、Fragment 的各个生命周期依次说一下,各个生命周期里面适合做什么
- Activity 调用 finish 方法后怎么走到 onDestroy 的
图片
- Glide缓存特点
- Glide为我们做了哪些内存优化
- Glide如何加载 GIF
- ListView 图片错位的原因,解决方案
- bitmap如何处理大图,30M的大图如何防止OOM?
网络
- OKHttp 如何实现缓存
- OKHttp 的超时时间,有考虑DNS超时码
- OKHttp 线程池、连接池讲下
- OKHttp 的所有拦截器有哪些,请求失败了重试1、2次怎么做
- Retrofit实现机制
- Room注解如何在编译时生成类文件
- http 和 https 的区别,shakehand的过程说下
- 状态码400、401,3xx有哪些
- 网络劫持是什么,应该怎么做
- TCP三次握手,握手中的网络包各个标记位是多少,四次挥手说一下
- TCP 发送窗口是什么?
- 混合开发h5了解多少
- 浏览器窗口访问一个网址的过程
- POST 和 GET 有什么区别
优化
- 内存泄漏分析,LeakCanary的原理,泄漏对象是如何找到引用链的
- APK瘦身
- 启动优化
- 卡顿分析!!
- ANR分析!!
- 为什么布局文件中层级越多,性能可能差很多
- 你有哪些应用性能优化的经验必问
- ProGuard怎么写
Java
1、Java中==和equals和hashCode的区别
2、int与integer的区别
3、谈谈对java多态的理解
4、String、StringBuffer、StringBuilder区别
5、抽象类和接口区别
6、Serializable 和Parcelable 的区别
7、string 转换成 integer的方式及原理
8、哪些情况下的对象会被垃圾回收机制处理掉?
9、什么是强引用、软引用、弱引用以及虚引用?
10、什么是依赖注入?能说几个依赖注入的库么?
11、静态代理和动态代理的区别,什么场景使用?
12、Java的异常体系
13、JVM的回收算法是怎样的
14、说一下泛型原理,并举例说明
15、能说说HashMap常用操作的底层实现原理吗?
16、垃圾回收机制和调用 System.gc()的区别?
17、说一下你所了解的设计模式有哪些
18、说下java中的线程创建方式,线程池的工作原理。
Kotlin
- Kotlin协程为什么能以同步代码写出异步逻辑?
- suspend 函数的工作原理
- 在协程上定义了一个局部变量,为什么在其中的其他线程里的协程也能访问到?
- by 的两种场景,by Lazy 的实现
- object 单例的实现
算法
- 各种排序算法(冒泡、选择、快排、归并。。。)的时间复杂度,各种查找算法(顺序查找,二分查找。。。)的时间复杂度
- LRU 实现(146)参考LinkedHashMap实现的3个方法
- LFU 缓存(460) 同一频率使用LRU的NodeList,外面套一层{freq to NodeList},NodeList用双链表实现
- 两数相加(445)
- 找缺失的数字(268)注意相似题目里有中等
- 两个队列实现栈(225)
- 删除子文件夹(1233)
- 螺旋矩阵打印(54)
- 用生成随机数1-5(1,2,3,4,5)的方法,得到一个可以生成随机数(1-7)的方法
- 54张扑克牌,分成3堆,大小王出现在同一堆的概率(排列组合算数题)
Android第三方库源码
1、网络底层框架:OkHttp实现原理
2、OKhttp针对网络层有哪些优化?
3、网络请求缓存处理,okhttp如何处理网络缓存的?
4、从网络加载一个10M的图片,说下注意事项?
5、网络封装框架:Retrofit实现原理
6、响应式编程框架:RxJava实现原理
7、图片加载框架:Glide实现原理
8、Glide如何确定图片加载完毕?
9、Glide内存缓存如何控制大小?
10、加载bitmap过程(怎样保证不产生内存溢出)
11、Android中软引用与弱引用的应用场景。
12、LruCache原理
13、Fresco与Glide的对比:
14、Bitmap如何处理大图,如一张30M的大图,如何预防OOM?
15、事件总线框架EventBus实现原理
16、内存泄漏检测框架:LeakCanary实现原理
17、leakCannary中如何判断一个对象是否被回收?
18、依赖注入框架:ButterKnife实现原理
19、依赖全局管理框架:Dagger2实现原理
20、数据库框架:GreenDao实现原理
性能优化
这个主要结合你所做过的项目问,一般面试官会问你项目做过哪些方面的优化,常见的问法就是:
优化的思路是什么
用到了哪些技术
遇到了哪些困难(问题)
如何解决
有什么心得
主要结合自己项目回答。切记不要自己给自己挖坑,比如没有做过这方面优化,你为了表现自己,说做过,结果面试官往下问回答不出来,这关乎诚信问题,你们懂的~
抽象问题
- 讲讲做过的项目,有哪些亮点
- 你自己的亮点在哪里,你的加入可以给团队带来什么
- 技术规划,怎么发展
设计题
- 如果让你设计一个音乐播放器,要实现哪些接口
- 设计一个图片下载库:深挖 Glide,如果图片没有设置有效期,如何保证缓存被更新?
下面统计一些公司的真实面试题
(一)泰科电子面经 高级安卓工程师社招面试题目
1.ContentProvider的权限管理(解答:读写分离,权限控制-精确到表级,URL控制)
2.如何通过广播拦截和abort一条短信?
3.广播是否可以请求网络?
4.广播引起anr的时间限制是多少?
5.计算一个view的嵌套层级
6.Activity栈
7.Android线程有没有上限?
8.线程池有没有上限?
9.ListView重用的是什么?
10.Android为什么引入Parcelable?
11.有没有尝试简化Parcelable的使用?
12.四大组件以及使用方式
13.网络请求
14.get/post请求的区别
15.xml/json的区别以及解析方式
16.谈谈对Handler的理解
17.service的启动方式
18.屏幕适配
19.ArrayList与LinkedList区别
20.Application和Activity的Context对象的区别
21.Android属性动画特性
22.如何导入外部数据库?
23.LinearLayout、RelativeLayout、FrameLayout的特性及对比,并介绍使用场景。
24.谈谈对接口与回调的理解
25.回调的原理
26.写一个回调demo
27.介绍下SurfView
28.RecycleView的使用
29.动态权限适配方案,权限组的概念
30.Android系统为什么会设计ContentProvider?
31.下拉状态栏是不是影响activity的生命周期
32.说说ContentProvider、ContentResolver、ContentObserver之间的关系
33.请描述一下广播BroadcastReceiver的理解
34.广播的分类
35.序列化的作用,以及Android两种序列化的区别
36.Android中PID和UID的区别
37.Binder的理解,以及为什么要用Binder,进程间通信的方式
38.框架搭建选型的注意点
39.第三方SDK应用
40.MVC、MVP设计模式
41.TCP与UDP的区别
42.Dalvik虚拟机方面
43.EventBus实现原理
44.对自定义view的理解
45.详细介绍下自己做过的项目对你的成长最大?哪个的收获最大?
46.你认为一名安卓工程师最重要的特质是什么?你在工作中最终重视的因素是什么?你在工作中是怎么保持持续学习的?
(二)咻电科技 安卓工程师 社招 面试技术题目
1.mvc和mvp的使用场景和优缺点
2.Hashmap实现原理
3.性能优化(一定要具体说出很多方案,比如内存、电量、流量等具体解决方案)
4.单例模式的写法和各种写法的优缺点
5.okHttp、volley、retrofit等网络框架的使用和原理
6.四大图片加载框架的使用和原理
7.如何考虑架构设计
8.自定义View,绘制流程、步骤,
9.事件拦截和分发机制
10.进程间的通信方式
11.应用的创建启动流程
12…Handler是怎么导致内存泄露的
13.设计模式理解问得也多,
14.Binder驱动
15.如果在onStop的时候做了网络请求,onResume的时候怎么恢复?
16.Bitmap使用时候注意什么?
17.Bitmap的recycler()
-
Android中开启摄像头的主要步骤
-
ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
-
点击事件被拦截,但是想传到下面的View,如何操作?
-
微信主页面的实现方式
22.微信上消息小红点的原理
23.如何优化自定义View
24.低版本SDK如何实现高版本api?
25.描述一次网络请求的流程
26.HttpUrlConnection和okhttp关系
27.Bitmap对象的理解
28.looper架构
29.Activity上有Dialog的时候按Home键时的生命周期
- 两个Activity之间跳转时必然会执行的是哪几个方法?
31.前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。
- ActivityThread,AMS,WMS的工作原理
33.自定义View如何考虑机型适配
34.自定义View的事件
35.AstncTask+HttpClient与AsyncHttpClient有什么区别?
36事件分发中的onTouch和onTouchEvent有什么区别,又该如何使用?
(三)腾讯社招安卓岗面试经历(凉)
1、synchronize用法,volatile用法,两者的区别和场景
2、动态权限适配方案,权限组的概念
3、网络请求缓存处理,okhttp如何处理网络缓存的;图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM
4、进程保活
5、listview图片加载错乱的原理和解决方案,listview是如何做缓存的?
6、https相关,如何验证证书的合法性,https中哪里用了对称加密,哪里用了非对称加密,两者的区别?
7、Android系统为什么会设计ContentProvider,进程共享和线程安全问题
(1)提供一种跨进程数据共享的方式:
由系统来管理ContentProvider的创建、生命周期及访问的线程分配,简化我们在应用间共享数据(进程间通信)的方式。我们只管通过ContentResolver访问ContentProvider所提示的数据接口,而不需要担心它所在进程是启动还是未启动 。
(2)更好的数据访问权限管理:
ContentProvider可以对开发的数据进行权限设置,不同的URI可以对应不同的权限,只有符合权限要求的组件才能访问到ContentProvider的具体操作。
微信的聊天数据在本地都是加密处理的(防止root了被破解),设计一个类似的本地数据存储系统
8、jvm相关和GC回收算法的区别
9、Android相关优化(如内存优化、网络优化、布局优化、电量优化、业务优化)
10、EventBus实现原理和观察者模式在开发中的运用?
11、动态代理模式如何运用?
12、App是如何沙箱化,为什么要这么做?
(四)滴滴社招面试
一面
1、询问项目相关的问题;
2、概述一下****HashMap
答:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
3、hashmap原理说一下;
4、HashMap什么时候进行扩容呢?
答:当HashMap中的元素个数超过数组大小时,就会进行数组扩容。
5、https相关过程说一下;
6、线程安全。synchronized,lock各种原理
7、如何保证通信安全性?
8、如何实现链表数组?
二面
1、项目经历介绍;
2、content-type有哪些值?
3、常见的响应码有哪些?
(1)200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
(2)404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
(3)500:请求资源找到了,但服务器内部出现了错误;
(4)302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
4、UNICODE和utf-8是干什么的,一个中文分别在其中占据多少大小?
5、如何批量发布?
6、应用崩溃了怎么办,如何收集崩溃信息?
7、应用网络不好如何判断?
8、通信如何保证安全?
9、android缓存如何缓存,图片如何缓存,数据如何缓存,缓存机制?**
10、js和android耦合;
11、react native
12、kotlin以及看法;
13、flutter
14、算法题:洗牌不回到原来位置;
三面
1、线程锁的区别;
2、同一个锁为什么效率有差别?
3、多态和重载区别;
(1)多态是建立在重bai写的基础之上的,是类与类du之间的zhi关系,是发生在不同的类之dao间的,子类重写zhuan父类的方法。实现不同的子类,不同的实现形态。多态有3个条件:继承、重写和父类引用指向子类对象
(2)重载则是类的内部的方法构型上的不同,是发生在同一个类里面的。同一个函数名称,参数不同的多个方法,实现同一类型的功能。
4、Hashmap
5、Jni
6、设计模式:观察者模式怎么用?
7、说一下自身的优缺点;
8、你对领导期望是?
9、你对滴滴了解有多少?印象如何?说一下你的看法。
(五)字节社招
一面
-
线程池的底层原理
-
四种引用类型
-
JAVA GC d. Sychornized关键字
-
静态同步函数
-
可不可以调用Abstrut 父类的super方法
-
HTTP协议中POST,GET 的区别
h. TCP/IP协议栈 i. TCP和UDP的区别
-
三次握手是什么?可以两次握手么
-
进程和线程的区别
-
手写ViewGroup树结构遍历
二面
-
ArrayList / LinkedList的区别
-
HashMap的底层实现原理
-
两个线程分别调用同一个类的实例函数和类函数
-
什么是可见性?举例场景
-
volatile关键字的意义
6.Class对象
-
线程结束的方法:Interrupt之后需要做什么
-
Android Activity切换生命周期
-
Activity保存状态的函数
1 0. 子线程对UI的操作方法
-
如何在应用程序远程调用中表明用户身份
-
单例模式、建造者模式、中介模式
-
手写中位数查找算法
三面
-
聊聊项目
-
Handler和Looper的底层结构
-
postRunnable方法的底层实现
-
Thread Run和Start的底层调用区别(是否中断陷入)
-
BroadCast的使用方法
-
Intent的使用方法
-
Intent-Filter
大厂面试复习路线
多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!
这里给大家提供一个方向,进行体系化的学习:
1、看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
系统学习方向:
- 架构师筑基必备技能: 深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
- Android高级UI与FrameWork源码: 高级UI晋升+Framework内核解析+Android组件内核+数据持久化
- 360°全方面性能调优: 设计思想与代码质量优化+程序性能优化+开发效率优化
- 解读开源框架设计思想: 热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
- NDK模块开发: NDK基础知识体系+底层图片处理+音视频开发
- 微信小程序: 小程序介绍+UI开发+API操作+微信对接
- Hybrid 开发与Flutter: Html5项目实战+Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。
**帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。**无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。
1.2021大厂面试高频知识点
- 图片
- 网络和安全机制
- 数据库
- 插件化、模块化、组件化、热修复、增量更新、Gradle
- 架构设计和设计模式
- 性能优化
- Android Framework
- Android优秀三方库源码
2.Jetpack架构组件从入门到精通
- Android Jetpack - Navigation
- Android Jetpack - Data Binding
- Android Jetpack - ViewModel & LiveData
- Android Jetpack - Room
- Android Jetpack - Paging
- Android Jetpack - WorkManger
- Android Jetpack架构组件之Lifecycle
- Android Jetpack Compose 最全上手指南
3.Framework精编内核解析
主要内容包含:
- 深入解析Binder
- 深入解析Handler
- Dalvik VM 进程系统
- 深入解析 WMS
- PackagerManagerService
4.Kotlin强化实战(附Demo)
- 第一章 Kotlin入门教程
- 第二章 Kotlin 实战避坑指南
- 第三章 项目实战《Kotlin Jetpack 实战》
- 从一个膜拜大神的 Demo 开始
- Kotlin 写 Gradle 脚本是一种什么体验?
- Kotlin 编程的三重境界
- Kotlin 高阶函数
- Kotlin 泛型
- Kotlin 扩展
- Kotlin 委托
- 协程“不为人知”的调试技巧
- 图解协程:suspend
5.Android设计思想解读开源框架
- 热修复
- 插件化
- 组件化框架设计
- 图片加载框架
- 网络请求框架
- RXJava 响应式编程框架设计
- IOC 架构设计
- Android架构组件Jetpack
6.NDK模块开发
- NDK 模块开发
- JNI 模块
- Native 开发工具
- Linux 编程
- 底层图片处理
- 音视频开发
- 机器学习
7.Android源码解析
编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
以上这些内容均免费分享给大家,需要完整版的朋友可以扫描下方二维码,免费分享给大家!
如果文章对你有帮助,麻烦伸出发财小手点个赞,感谢您的支持,你的点赞是我持续更新的动力。