前言
现在百度,阿里,腾讯,字节跳动等大厂的Android开发面试真题、面经随处可见。但是中小厂的面经倒是很稀缺。但其实中小厂面经的需求还是有的,很多的Android开发者可能由于地理,能力,兴趣,志向的不同,短期或长期并没有进入大厂的打算,即便可以通过网上的各种渠道获取到所谓的 “题海” 。然后疯狂的刷面试题,进行题海战术,但还是对面试感到迷茫。
我本人正是由于这样那样的原因(当然还是实力不行),短期内并没有进入大厂的打算,再加上被前公司优化了,所以选择了近十家中小企业进行了面试,采用录音的形式将面试题记录下来,并整理出本篇中小厂面经。
本文的主旨是面经,而非面试题的整合,文中会对部分面试题进行讲解,也会有部分我在面试中的经历和我当时是怎么回答这个问题的,只是给大家提供个思路,绝非标准答案。
宇宙集市
一面
Java方面
- 静态变量和实例变量的区别
- 静态变量有static关键字修饰
- 静态变量不属于某个实例对象,而是属于类,也叫类变量,只要程序加载了类的字节码,不用创建任何实例对象就会被分配空间,就可以被使用,也就是说,你创建了多个对象,他们共用了一个静态变量,而实例对象是属于自己的独有的,不会被共享!(可以Class.var使用),位于方法区
- 实例变量必须创建对象后,才可以通过这个对象来使用。即new Class().var,位于堆区
- “==” & equals()
- 浅拷贝 & 深拷贝
- HashMap , 扩容机制
- 多个线程如果共享多个资源,需要怎么保证安全
- volatile,CAS/ABA
Android方面
- 事件的分发机制
- Handler原理
- TCP UDP
- Kotlin和Java的区别
极豆车联网
一面:
- 一个平面上n个点,找出k条线穿过max点数
- 100位面试者,每人要四轮面试,怎么分配面试官
二面:
- 手撕:最长单调区间
- Android/ 布局优化
- Activity启动模式
- RecyclerView和ListView区别
- Handler机制,loop方法为何不会造成ANR
- View绘制流程
- SingleTop和standard启动模式下,生命周期回调有何不同
- onStart和onResume区别
- Java/ 面向对象三大特性
- Array和Linked区别
- HashMap底层
- 进程间通信方式
- equals和==区别
- 线程间加锁的方式
- 知道啥设计模式
- synchronized的不同使用
- 异常
- 线程池
- 创建线程的方式
- OS/ 死锁
- 网络/ tcp和udp的区别
双旗科技
Android方面:
-
讲一下Android发生Crash的整体流程。Android在遇到非可检异常时就会触发该线程的 unCatchExcepttionHandler中的unCatchException()方法,最终在该方法的 process.kill()方法中杀死该进程,appCrash完成。
-
Native层Crash是如何捕获到的?Android NativeCrash发生时会向该进程发出错误的不可处理信号,Linux系统收到该信号后无法处理便会杀死进程,发生Crash。Android当中捕获的方法主要是使用了Linux系统下的核心转储机制,在发生Crash前系统会记录下当前的上下文信息,形成tombstone文件,存储起来,再杀死线程,这个tombstone文件就是我们要分析的对象。
-
Java层Crash是如何捕获到的?JavaCrash的捕获有几个关键部分
-
RuntimeInit类中的LoggingHandler类,用于打印日志时使用
-
RuntimeInit类中的KillApplicationHandler类,是一个系统默认的 UncaughtExceptionHandler,用于发生JavaCrash时kill掉进程
-
RuntimeInit类中的commonInit方法,其内部就是初始化了所有线程的set UncaughtExceptionHandler()。因此在发生非可检异常时,就会调用该线程的
UncaughtExceptionHandler.unCatchException方法,在该方法内部进行捕获。 -
如何做到发生异常时不会杀死APP?在
UncaughtExceptionHandler.unCatchException方法调用Looper进行死循环可以。 -
讲一下Handler机制
-
Looper的定时器是用如何实现的?通过nativePollOnce(ptr, nextPollTimeoutMillis);定时睡眠nativeWake(mPtr);进行唤醒
-
APK包里有什么?主要有5个部分:
- dex文件:.class文件编译后的产物
- Assets:资源文件,如图片等,主要是通过AssetsManger来进行加载。
- Resource:资源文件,layout等,通过R.xxxxxx.id来进行引用
- Library:so库引用目录
- META-INF:APK 签名有关的信息
-
APP在运行时是通过什么来获取到layout文件的?
-
讲一下surfaceview跟textview。
-
Activity A 启动 Activity B 时,他们在同一个栈的情况下生命周期以及执行顺序是怎么样的?
-
Destroy()方法是什么时候调用的?
-
调用finish()方法。
-
Handler中已经没有要处理的message。 满足这两个条件才会调用。
Java方面:
- 有什么线程同步的机制?
- volatile关键字讲一下。
- volatile如何实现可见性?
- synchronize如何实现可见性?
- volatile防止指令重排代码级别如何实现?
智建云
一面
- jvm内存模型
- new 对象的过程
- 类加载过程
- ClassLoader源码
- final关键字
- 匿名内部类
- 讲下垃圾回收算法
- LinkedList && ArrayList
- hashMap
- 常用注解,spring中的注解
- 锁,synchronized底层原理
- https && http
- 浏览器输入地址后的过程
- 状态码 303 304
- 你知道的设计模式
- 单例模式 说了双重校验锁,静态内部类 ,不同场景下如何选择
- 双重校验锁为什么要两次判空
- volatile,指令重排
二面:
- Activity启动模式
- Activity A → B的生命周期在这四种启动模式下的状态
- 广播类型
- 有序广播如何实现的按顺序收到广播
- 持久化存储方式
- SharedPreferences的格式
- xml解析方式
- json与xml的区别,json为什么比xml更好
- Android view绘制流程
- surfaceView
- sp, dp, px的区别
- 机型大小适配
- 适配语言
- ANR 什么时候出现,如何排查
- Android动画
- startService与bindService的区别
- Service保活方式
- java泛型,<? extends T>能否add元素
- 重写equals方法需要重写hashCode方法吗
- ThreadLocal
- wait,sleep,yield,join的区别
经验总结
多家面试总结下来,考察范围都很广,包括基础知识、项目。
基础知识这块,需要花大量时间准备每一个细节,知其所以然,这样才能面试的时候问起来,都能头头是道。
项目,不仅要熟悉项目做了什么事情,而且要提炼出项目中的闪光点或者说不一样的地方,这些在面试之前都要想清楚。
然后就是要多刷题。面试了这么多公司,除了极少部分,其他公司的每一轮都会要求做题,所以在面试之前要对各种常见面试题了解,有时间的话多去刷刷题找感觉。
面试题笔记分享
为了助力朋友们跳槽面试、升职加薪、职业困境,提高自己的技术,本文给大家整了一套涵盖Android所有技术栈的快速学习方法和笔记。目前已经收到了七八个网友的反馈,说是面试问到了很多这里面的知识点。
每一章节都是站在企业考察思维出发,作为招聘者角度回答。从考察问题延展到考察知识点,再到如何优雅回答一面俱全,可以说是求职面试的必备宝典,每一部分都有上百页内容,接下来具体展示,完整版可直接下方扫码领取。