前言
一年之计在于春 金三银四已经要到来, 2019 的新的开始, 作为一个开发人员, 你是否面上了自己理想的公司, 薪资达到心中理想的高度?
面试: 如果不准备充分的面试, 完全是浪费时间, 更是对自己的不负责.
今天给大家分享下我整理的 Java 架构面试专题及答案, 其中大部分都是大企业面试常问的面试题, 可以对照这查漏补缺, 当然了, 这里所列的肯定不可能覆盖全部方式, 不过也希望能对即将找工作的朋友起到一些帮助!
Android 面试的重点:
Java 相关的基础, 数据结构与算法, 性能调优, 设计模式, NDK 技术, 人工智能, 音视频开发以及混合开发等. 在这由于文字很多, 我总结了 Android 面试所涉及到的常问范围及常问面试题(含答案), 以及系统的进阶视频资料, 免费分享给大家, 省去网上搜集的麻烦. 文末有领取!
部分面试常问的面试专题
一, Java 篇
1. 多线程并发;
sleep 和 wait 区别
join 的用法
线程同步: synchronized 关键字等
线程通信
线程池
手写死锁
2.Java 中的引用方式, 及各自的使用场景
3.HashMap 的源码
4.GC(垃圾回收)是什么? 如何工作的? 回收算法有哪些
5.Error 和 Exception 区别?
6. 反射和注解了解吗? 项目中有使用过吗?
7. 网络相关:
http 状态码
http 与 https 的区别? https 是如何工作的?
8.Java 中 LRUCache 是如何实现的(源码角度)? 为什么要用 LinkedHashmap?
9. 设计模式:
手写单例, volitate 关键字的原理
手写生产者消费者模式
项目中都使用过哪些设计模式?
编码常遵循的设计原则: 单一职责, 开闭原则, 里氏替换等
10.ArrayList 和 LinkedList 区别?
二, Android
1. 源码相关:
Activity 启动过程
事件分发源码, 以及由此衍生的事件拦截如何实现
消息机制: Handler 源码(结合 Looper,MessageQueue), 以及取不到消息时会怎样?
View.post 为什么可以拿到宽高?
2. 自定义 View;
流程: onMeasure, onLayout, onDraw
onMeasure 中的 MeasureSpec 是如何计算的?
3.Dalvik 运行的是自定义的. dex 字节码格式.
4. 如何捕获应用全局异常?
5.Service 是使用, bind 和 start 的区别?
6.Android 中的 IPC 机制有哪些?(接着往下问)
7. 属性动画源码?
8. 大图加载
9.ANR 如何定位, 如何分析?(trace 日志)
10. 项目中使用了哪些开源库? 挑一个说说源码?
11.MVC 和 MVP 区别?
12.Activity:
A 启动 B, 生命周期是怎么走的?(注意区分 B 是否是透明的)
启动模式
13.AsyncTask 原理?
三, 性能优化
1.Android UI 适配;
字体使用 sp, 使用 dp, 多使用 match_parent,wrap_content,weight
图片资源, 不同图片的的分辨率, 放在相应的文件夹下可使用百分比代替.
2.App 优化:(工具: Hierarchy Viewer 分析布局 工具: TraceView 测试分析耗时的)
3.App 启动优化
4. 布局优化(尽量不要过于复杂的嵌套. 可以使用,,)
5. 响应优化;;
Android 系统每隔 16ms 会发出 VSYNC 信号重绘我们的界面(Activity)
页面卡顿的原因:(1)过于复杂的布局.(2)UI 线程的复杂运算 (3) 频繁的 GC
导致频繁 GC 有两个原因:
(-1), 内存抖动, 即大量的对象被创建又在短时间内马上被释放.(2), 瞬间产生大量的对象会严重占用内存区域.
6. 内存优化: 参考内存泄露和内存溢出部分
7. 电池使用优化(使用工具: Batterystats & bugreport);
优化网络请求
定位中使用 GPS, 请记得及时关闭
8. 网络优化 (网络连接对用户的影响: 流量, 电量, 用户等待) 可在 Android studio 下方 logcat 旁边那个工具 Network Monitor 检测
API 设计: App 与 Server 之间的 API 设计要考虑网络请求的频次, 资源的状态等. 以便 App 可以以较少的请求来完成业务需求和界面的展示.
Gzip 压缩: 使用 Gzip 来压缩 request 和 response, 减少传输数据量, 从而减少流量消耗.
图片的 Size: 可以在获取图片时告知服务器需要的图片的宽高, 以便服务器给出合适的图片, 避免浪费.
网络缓存: 适当的缓存, 既可以让我们的应用看起来更快, 也能避免一些不必要的流量消耗.
9. 图片优化;
对图片本身进行操作. 尽量不要使用 setImageBitmap,setImageResource,BitmapFactory.decodeResource 来设置一张大图, 因为这些方法在完成 decode 后, 最终都是通过 java 层的 createBitmap 来完成的, 需要消耗更多内存.
图片进行缩放的比例, SDK 中建议其值是 2 的指数值, 值越大会导致图片不清晰.
不用的图片记得调用图片的 recycle()方法
四, NDK 和前沿技术
1. 谈谈你对 JNI 和 NDK 的理解;
JNI 是 Java Native Interface 的缩写, 即 Java 的本地接口.
目的是使得 Java 与本地其他语言 (如 C/C++) 进行交互.
JNI 是属于 Java 的, 与 Android 无直接关系.
NDK 是 Native Development Kit 的缩写, 是 Android 的工具开发包.
作用是更方便和快速开发 C/C++ 的动态库, 并自动将动态库与应用一起打包到 apk.
NDK 是属于 Android 的, 与 Java 无直接关系.
总结:
JNI 是实现的目的, NDK 是 Android 中实现 JNI 的手段.
2. 谈谈你对 JNIEnv 和 JavaVM 理解;
JavaVM 是虚拟机在 JNI 层的代表
一个进程只有一个 JavaVM.(重要!)
所有的线程共用一个 JavaVM.(重要!)
JNIEnv 表示 Java 调用 native 语言的环境, 封装了几乎全部 JNI 方法的指针.
JNIEnv 只在创建它的线程生效, 不能跨线程传递, 不同线程的 JNIEnv 彼此独立.(重要!)
注意:
在 native 环境下创建的线程, 要想和 java 通信, 即需要获取一个 JNIEnv 对象. 我们通过 AttachCurrentThread 和 DetachCurrentThread 方法将 native 的线程与 JavaVM 关联和解除关联.
3. 怎么定位 NDK 中的问题和错误;
一般在开发阶段的话, 我们可以通过 log 来定位和分析问题
如果是上线状态(即关闭了基本的 log), 我们可以借助 NDK 提供的 addr2line 工具和 objdump 工具来定位错误
其它还可以使用 C/C++ 的一些分析工具
静态注册和动态注册;
静态注册; 通过 JNIEXPORT 和 JNICALL 两个宏定义声明,
Java + 包名 + 类名 + 方法名
形式的函数名. 不好的地方就是方法名太长了.
动态注册; 通常在 JNI_OnLoad 方法中通过 RegisterNatives 方法注册, 可以不再遵从固定的命名写法(当然为了代码容易理解, 名称还是尽量和 Java 中保持一致)
5.API
有的变态题目还是会考验你一些 API 的运用, 比如怎么在 JNI 里面调用 Java 的方法, 怎么在 JNI 里面抛异常等等. 所以一些 API 还是要熟悉一下的, 大致都是什么功能, 名字大致是啥呀, 这个太多了, 就不详细介绍了.
五, 跨平台混合开发
1.weex 框架;
如何搭建 weex 的开发环境(node,webpack,Android,iOS,weextoolkit)
构建的工具和基础用法(NPM 的使用, webpack 基础用法)
编写 ui 界面的几种方式(vuejs 脚本编写, CSS 样式编写, tpl 模板编写)
weex 的内置能力?(weex 实例子变量, weex 内置组件, weex 内置模块, weex 事件, 有无此方面的项目实战?)
weex ui 架构(weex ui 安装与配置, 使用 layout 布局组件, 使用 navigator 导航组件, 使用 utils 工具方法)
2.flutter;
flutter 开发环境的搭建
flutter 编码语言 dart 的认识?
dart 面向对象的原理
dart 中变量, 函数, 操作符, 异常语法与 Java 原理的异同
类的机制
初始化列表的规则
命名构造方法
mixin
flutter 框架的原理, 以及使用技巧(布局分析, 如何自定义 view? 动画 / 手势交互, 多线程开发原理, 有无实战发布过自己的 flutter 库)
最后
针对于上面的面试题, 我总结出了互联网公司 Android 程序员面试涉及到的绝大部分面试题及答案, 并整理做成了文档, 以及系统的进阶学习视频资料, 免费分享给大家.
(包括 Java 在 Android 开发中应用, App 框架知识体系, 高级 UI, 全方位性能调优, NDK 开发, 音视频技术, 人工智能技术, 跨平台技术等技术资料), 希望能帮助到你面试前的复习, 且找到一个好的工作, 也节省大家在网上搜索资料的时间来学习.
资料领取方式: 加 Android 技术交流群; 964557053, 找群管理免费领取. 备注一下简书看到的来领取资料就可以了!
Android 进阶视频 + 面试资料部分截图
来源: http://www.jianshu.com/p/a2816ab3caf9