该面试宝典不仅收录了本人亲身面试遇到的问题,还收录了从一些朋友那里收集过来的问题。在以后的工作中本 人也会不断的更新和充实该面试宝典,当然也希望大家能够多多奉献比较优质的面试题。
该面试宝典不仅展示了常见的面试问题以及回答技巧,还详细讲解了每一道题所包含的知识点,让每个程序员不仅知其然,更知其所以然。
大家可以通过我记录下的这些面试实战记录略微感知一下真实面试的情况,从中学习一些面试技巧以便让自己在未来的面试中能够得心应手,顺利拿到自己喜欢的 offer。
正文总共分为6个部分:
- Java 基础(★★)
- Java 高级(★★)
- Android 基础(★★★)
- Android 高级(★★★)
- Android 项目(★★★)
- 项目面试常见问题(★★★)
一、Java 基础(★★)
Java 面向对象思想
- 面向对象都有哪些特性以及你对这些特性的理解
- 如何理解 clone 对象
Java 中的多态
- Java 中实现多态的机制是什么?
Java 的异常处理
- Java 中异常分为哪些种类
- 调用下面的方法,得到的返回值是什么
- error 和 exception 的区别
- java 异常处理机制
- 请写出你最常见的 5 个 RuntimeException
Java 的数据类型
- Java 的基本数据类型都有哪些各占几个字节
- String 是基本数据类型吗?可以被继承吗?
Java 的 IO
- Java 中有几种类型的流
- 字节流如何转为字符流
- 如何将一个 java 对象序列化到文件里
- 字节流和字符流的区别
Java 的集合
- HashMap 排序题
- 集合的安全性问题
- ArrayList 内部用什么实现的?
- 并发集合和普通集合如何区别?
- List 的三个子类的特点
- List 和 map 的区别
- HashMap 和 HashTable 有什么区别?
- 数组和链表分别比较适合用于什么场景,为什么?
- Java 中 ArrayList 和 Linkedlist 区别?
- List a=new ArrayList()和 ArrayList a =new ArrayList()的区别?
- 要对集合更新操作时,ArrayList 和 LinkedList 哪个更适合?
- 请用两个队列模拟堆栈结构
Java 的多线程
- 多线程的两种创建方式
- 在 java 中 wait 和 sleep 方法的不同?
- synchronized 和 volatile 关键字的作用
- 分析线程并发访问代码解释原因
- 什么是线程池,如何使用?
- 请叙述一下您对线程池的理解?
- 线程池的启动策略?
- 如何控制某个方法允许并发访问线程的个数?
- 三个线程 a、b、c 并发运行,b,c 需要 a 线程的数据怎么实现
- 同一个类中的 2 个方法都加了同步锁,多个线程能同时访问同一个类中的这两个方 法吗?
- 什么情况下导致线程死锁,遇到线程死锁该怎么解决?
- Java 中多线程间的通信怎么实现?
Java 高级(★★)
Java 中的反射
- 说说你对 Java 中反射的理解
Java 中的动态代理
- 写一个 ArrayList 的动态代理类
- 动静态代理的区别,什么场景使用?
Java 中的设计模式&回收机制
- 你所知道的设计模式有哪些
- 单例设计模式
- 工厂设计模式
- 建造者模式(Builder)
- 适配器设计模式
- 装饰模式(Decorator)
- 策略模式(strategy)
- 观察者模式(Observer)
- JVM 垃圾回收机制和常见算法
- 谈谈 JVM 的内存结构和内存分配
- Java 中引用类型都有哪些?
- heap 和 stack 有什么区别
Java 的类加载器
- Java 的类加载器的种类都有哪些?
- 类什么时候被初始化?
- Java 类加载体系之 ClassLoader 双亲委托机制
Android 基础(★★★)
Android 基本常识
- 写 10 个简单的 linux 命令
- 书写出 android 工程的目录结构
- 什么是 ANR 如何避免它?
- 谈谈 Android 的优点和不足之处
- 一条最长的短信息约占多少 byte?
- 如何判断是否有 SD 卡?
- dvm 的进程和 Linux 的进程, 应用程序的进程是否为同一个概念?
- Android 程序与 Java 程序的区别?
- 启动应用后,改变系统语言,应用的语言会改变么?
- 请介绍下 adb、ddms、aapt 的作用
- ddms 和 traceview 的区别
- 补充知识:TraceView 的使用
- Android 中数据存储方式有哪些?
- DVM 和 JVM 的区别?
- 谈一谈 Android 的安全机制
- Android 的四大组件都需要在清单文件中注册吗?
- 在 Android 中进程的级别有哪些?
- sp 频繁操作有什么后果?sp 能存多少数据?
- 描述一下 Android 的系统架构
- 解释一下 Android 程序运行时权限与文件系统权限的区别?
- AndroidManifest.xml 中的 targerSDK 设置有什么作用?
Activity
- 什么是 Activity?
- 请描述一下 Activity 生命周期
- Activity 的状态都有哪些?
- 如何保存 Activity 的状态?
- 两个 Activity 之间跳转时必然会执行的是哪几个方法?
- 横竖屏切换时 Activity 的生命周期
- 如何将一个 Activity 设置成窗口的样式?
- 如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?
- 请描述一下 Activity 的启动模式都有哪些以及各自的特点
- 一个启动模式为 singleTop 的 activity,如果再试图启动会怎样? 面试官想问的是 onNewIntent()
- 两个 Activity 之间传递数据,除了 intent,广播接收者,content provider 还有啥 方式?
- 怎样在两个 Activity 之间传递一张图片
- 如何实现切换主题功能?
- Android 中 Activity 是如何启动的?
Service
- Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?
- Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?
- 请描述一下 Service 的生命周期
- 什么是 IntentService?有何优点?
- 说说 Activity、Intent、Service 是什么关系
- Service 和 Activity 在同一个线程吗
- Service 里面可以弹吐司么?
- 如何让一个 Service 成为前置进程?
- Service 的 onStartCommand 方法有几种返回值?各代表什么意思?
- Service 的 onRebind(Intent)方法在什么情况下会执行?
- Activity 调用 Service 中的方法都有哪些方式?
- Activity 如何给 Service 发送 Message?
- Service 如何给 Activity 发送 Message?
- 子线程不能代替 service 吗?
BroadCastReceiver
- 请描述一下 BroadcastReceiver
- 在 manifest 和代码中如何注册和使用 BroadcastReceiver
- BroadCastReceiver 的生命周期
- 如何让自己的广播只让指定的 app 接收
- 什么是最终广播接收者?
- 广播的优先级对无序广播生效吗?
- 动态注册的广播优先级谁高?
- 如 何 判 断 当 前 BroadcastReceiver 接 收 到 的 是 有 序 广 播 还 是 无 序 广 播 ?
- Android 引入广播机制的用意
- 网络状态改变是无序广播还是有序广播,安装了,没启动过,会接受这个广播么?
ContentProvider&数据库
- 请介绍下 ContentProvider 是如何实现数据共享的?
- 为什么要用 ContentProvider?它和 sql 的实现上有什么差别?
- 说说 ContentProvider、ContentResolver、ContentObserver 之间的关系
- 如何访问 asserts 资源目录下的数据库?
- 如何在高并发下进行数据库查询?
Android 中的布局
- Android 中常用的布局都有哪些
- 谈谈 UI 中, Padding 和 Margin 有什么区别?
- 使用权重如何让一个控件的宽度为父控件的 1/3?
- Android 中布局的优化措施都有哪些?
- android:layout_gravity 和 android:gravity 的区别?
ListView
- ListView 如何提高其效率?
- ViewHolder 为什么要声明为静态类?
- 在 Activity 中使用 Handler 的时候如何去除警告信息?
- 谈谈 ListView 中的 MVC 思想?
- ListView 使用了哪些设计模式?
- 当 ListView 数据集改变后,如何更新 ListView?
- ListView 如何实现分页加载
- ListView 可以显示多种类型的条目吗?
- ListView 如何定位到指定位置
- 如何在 ScrollView 中如何嵌入 ListView
- ListView 中如何优化图片
- ListView 中图片错位的问题是如何产生的
- scrollView 嵌套 listview 方式除了测量还有什么方法?
JNI & NDK
- 在 Android 中如何调用 C 语言
- 请介绍一下 NDK
- JNI 调用常用的两个参数
Android 中的网络访问
- Android 中如何访问网络
- 如何解析服务器传来的 JSON 文件
- 如何解析服务器传来的 XML 格式数据
- 如何从网络上加载一个图片显示到界面
- 如何播放网络视频
- 常见的访问网络 API 都有哪些?
Intent
- Intent 传递数据时,可以传递哪些类型数据?
- Serializable 和 Parcelable 的区别
- 请描述一下 Intent 和 IntentFilter
Fragment
- Fragment 跟 Activity 之间是如何传值的?
- 描述一下 Fragment 的生命周期
- Fragment 的 replace 和 add 方法的区别
- Fragment 如何实现类似 Activity 栈的压栈和出栈效果的?
- ViewPager+Fragment 的左右滑动,如何实现 Fragment 的懒加载,Viewpager 默认加载几个?
Android 高级(★★★)
Android 性能优化
- 如何对 Android 应用进行性能分析
- 什么情况下会导致内存泄露
- 如何避免 OOM 异常
- Android 中如何捕获未捕获的异常
- Android 动态加载机制
- 如果加载高清大图片,不用第三方,不压缩,怎么处理防止 OOM
Android 屏幕适配
- 屏幕适配方式都有哪些
- 屏幕适配的处理技巧都有哪些
- dp 和 px 之间的关系
AIDL
- 什么是 AIDL 以及如何使用
自定义控件
- 如何自定义一个控件
- 请描述一下 View 的绘制流程
- View,SurfaceView,GLSurfaceView 有什么区别?
Android 中的事件处理
- Handler 机制
- 事件分发机制
- 在 Android 中主线程如何给子线程发 Message?
Android 签名
- 简单描述下 Android 数字签名
- 使用 Eclipse 如何生成数字签名
Android 中的动画
- Android 中的动画有哪几类,它们的特点和区别是什么
- 如何修改 Activity 进入和退出动画
网络协议
- Http 和 Https 有什么区别?
- 简述 Socket 通讯编程
- Binder 机制
- 如何保证网络传输数据的安全性
- 自己设计一个 Push 推送服务,需要考虑到那些点
其他
- AsyncTask 如何使用
- 都使用过哪些框架、平台
- Glide 原理
- Android 四大著名图片处理框架
- 都使用过哪些自定义控件
- volley 的原理
- okhttp 的原理
- ViewPagerindicator 的原理
- slidingmenu 的原理
- RecyclerView 的原理
Android 项目(★★★)
- 如何让 LinearLayout 自动换行如下图的颜色分类所示
- ImageLoader 在项目中的使用
- Java 和 javaScript 互相调用(webview 和 js 的互相调用)
- PopupWindow 弹出层在项目中的使用
- Notification 在 Android 中的使用
- 带索引的 ListView 在 Android 中的应用
- 随手势滑动而消失 Activity 的使用
- TouchGallery 在 Android 中的应用
- TextView 显示富文本
- CircleImageView 实现圆形图片
- 网易新闻客户端频道管理的实现
- Android 瀑布流的实现
- 监听键盘事件
- 可以按照字母排序的 ListView
- 省市区三级联动
- 购物客户端二级菜单
- 微信图片选择器
- 如何从 html 的一个动作打开 app 并跳转到指定的 Activity
- AAR 库怎么来配置
- 不借助第三方怎么显示圆形图片
项目面试常见问题(★★★)
- 开发周期
- 项目中遇到的难题
- 项目中最大的收获
- 项目是如何上线的
- 项目是如何盈利的
- 绘制项目架构图
- 项目开发流程
- 你在项目中的角色
- 你负责项目中的哪些模块
- 讲讲你负责模块的具体实现
- 项目中都用到了哪些第三发框架
- 有没有自己写过框架
- 业余时间你是如何提高自己(学习)的
- 有没有自己的技术 blog
- 你的职业规划
- 为什么离职
- 为什么选择我们公司
- 说说你们项目的亮点和不足
- 你们的项目是如何保持风格一致的
- 项目架构是如何搭建的
- 屏幕适配是如何解决的
- 都看过哪些源码
- 项目版本是如何升级的
- 用的什么版本控制工具
- 你能独立开发吗
- App 跟服务器是如何交互的
- 需求文档写过吗
- 接口文档写过吗
- 云服务器都用过哪些
- 第三方平台都用过哪些
简历+社招解答+经典HR面试解析
以上是整理总结的Android中高级面试遇到的真题解析,希望对大家有帮助;同时很多人经常也会遇到很多关于简历制作,职业困惑、HR经典面试问题回答等有关面试的问题。同样我也搜集整理了全套简历制作、金三银四社招困惑、HR面试等问题解析,有疑问,可以提供专业的解答。
对于Android开发的朋友来说应该是最全面最完整的面试资料,为了更好地整理每个模块,我参考了很多网上的优质博文和项目,力求不漏掉每一个知识点。很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个资料也已经帮助了很多的安卓开发者,希望也能帮助到你。
最后想要获取完整的《2020 Android BAT面试宝典》,可以私信我【666】。
面试大厂复习路线
多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!
这里给大家提供一个方向,进行体系化的学习:
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、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
总结
改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。
耗时一年多整理的一系列Android学习资源:Android源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记
等等,这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容