985毕业的“打工人”,Android开发2年被裁,重新出发终于拿下字节offer

个人自我介绍

鄙人出生于南方小乡镇,为了走出小镇,在当地够拼够努力,不是自夸,确确实实也算得上“别人家的小孩”,至少在学习这件事情少,没有要家里人操过心。

高考特别顺利,一个老牌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()

  1. Android中开启摄像头的主要步骤

  2. ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?

  3. 点击事件被拦截,但是想传到下面的View,如何操作?

  4. 微信主页面的实现方式

22.微信上消息小红点的原理

23.如何优化自定义View

24.低版本SDK如何实现高版本api?

25.描述一次网络请求的流程

26.HttpUrlConnection和okhttp关系

27.Bitmap对象的理解

28.looper架构

29.Activity上有Dialog的时候按Home键时的生命周期

  1. 两个Activity之间跳转时必然会执行的是哪几个方法?

31.前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。

  1. 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、你对滴滴了解有多少?印象如何?说一下你的看法。

(五)字节社招

一面

  1. 线程池的底层原理

  2. 四种引用类型

  3. JAVA GC d. Sychornized关键字

  4. 静态同步函数

  5. 可不可以调用Abstrut 父类的super方法

  6. HTTP协议中POST,GET 的区别

h. TCP/IP协议栈 i. TCP和UDP的区别

  1. 三次握手是什么?可以两次握手么

  2. 进程和线程的区别

  3. 手写ViewGroup树结构遍历

二面

  1. ArrayList / LinkedList的区别

  2. HashMap的底层实现原理

  3. 两个线程分别调用同一个类的实例函数和类函数

  4. 什么是可见性?举例场景

  5. volatile关键字的意义

6.Class对象

  1. 线程结束的方法:Interrupt之后需要做什么

  2. Android Activity切换生命周期

  3. Activity保存状态的函数

1 0. 子线程对UI的操作方法

  1. 如何在应用程序远程调用中表明用户身份

  2. 单例模式、建造者模式、中介模式

  3. 手写中位数查找算法

三面

  1. 聊聊项目

  2. Handler和Looper的底层结构

  3. postRunnable方法的底层实现

  4. Thread Run和Start的底层调用区别(是否中断陷入)

  5. BroadCast的使用方法

  6. Intent的使用方法

  7. Intent-Filter

  8. 手写外部排序算法

大厂面试复习路线

多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

这里给大家提供一个方向,进行体系化的学习:

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进阶

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
在这里插入图片描述

3、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

4、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

猜你喜欢

转载自blog.csdn.net/weixin_43440181/article/details/121474651