最近看到有人发布了下面的Android面试题,但是没有答案,于是根据自己的理解和网上的搜索补充了一些题目的答案,欢迎指教。
Java技术
Java基础
- 对抽象、继承、多态的理解
封装
是面向对象编程的特征之一,也是类和对象的主要特征。封装将数据以及加在这些数据上的操作组织在一起,成为有独立意义的构件。外部无法直接访问这些封装了的数据,从而保证了这些数据的正确性。如果这些数据发生了差错,也很容易定位错误是由哪个操作引起的。继承
是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类的继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且派生类可以修改或增加新的方法使之更适合特殊的需求。这也体现了大自然中一般与特殊的关系。继承性很好地解决了软件的可重用性问题多态性
是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择”编辑”、”粘贴”操作,在字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和运行时多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好地解决了应用程序函数同名问题。
- 泛型的作用及使用场景
- 作用:类型安全检查,消除强制转换
- 使用场景:android 中的 Adapter
- 枚举的特点及使用场景
- 特点:常量、类型安全
- 使用场景:每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值的集合。
- 线程sleep和wait的区别
- sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
- wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。
- JAVA反射机制
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
- weak/soft/strong引用的区别
- WeakReference 不会强制对象保存在内存中。它拥有比较短暂的生命周期,允许你使用垃圾回收器的能力去权衡一个对象的可达性。在垃圾回收器扫描它所管辖的内存区域过程中,一旦gc发现对象是weakReference可达,就会把它放到ReferenceQueue中,等下次gc时回收它。
- Soft reference 当对象是Soft reference可达时,gc会向系统申请更多内存,而不是直接回收它,当内存不足的时候才回收它。因此Soft reference适合用于构建一些缓存系统,比如图片缓存。
- Strong references 普通new出来的对象。
- Object的hashCode()与equals()的区别和作用
- 区别:equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。 hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。
-作用:equals用于比较对象内容是否相等,hashcode在集合中用到。
- 区别:equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。 hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。
集合类
- JAVA常用集合类功能、区别和性能
- 并发相关的集合类
- ConcurrentHashMap
- ConcurrentSkipListMap
- ConCurrentSkipListSet
- CopyOnWriteArrayList
- CopyOnWriteArraySet
- ConcurrentLinkedQueue;
- 部分常用集合类的内部实现方式
多线程相关
- Thread、Runnable、Callable、Futrue类关系与区别
- Callable规定的方法是call(),Runnable规定的方法是run()。
- Callable的任务执行后可返回值,而Runnable的任务是不能返回值得。
- call方法可以抛出异常,run方法不可以。
- 运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。
- Future.get()方法可能会阻塞当前线程的执行。
- JDK中默认提供了哪些线程池,有何区别
- 线程同步有几种方式,分别阐述在项目中的用法
- 在理解默认线程池的前提下,自己实现线程池
字符
- String的不可变性
- String类中使用字符数组保存字符串,
private final char value[]
,因为有“final”修饰符,所以可以知道string对象是不可变的。
- String类中使用字符数组保存字符串,
- StringBuilder和StringBuffer的区别
- StringBuilder:线程非安全的,速度最快。
- StringBuffer:线程安全的
- 字符集的理解:Unicode、UTF-8、GB2312等
-GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换 - 正则表达式相关问题
注解
- 注解的使用
- 注解的级别及意义
- 如何自定义注解
Android技术
Android基础
- 四大组件的意义及使用,生命周期回调及意义
- AsyncTask、Handler的使用
- Android系统层次框架结构
- AsyncTask的实现方式
- AsyncTask使用的时候应该注意什么
- Android常见的存储方式
- Looper、Handler和MessageQueue的关系
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 - Activity的启动流程(考察对Framwork的熟悉程度)
- 多进程开发的注意事项(Application类区分进程,进程间内存不可见、进程间通讯方式)
Resource相关
- .9图片的意义
- style和theme的作用及用法
- theme是对整个应用中所有的Activity都起作用,或者对指定的Activity起作用 定义格式通常是改变窗口的外观格式,标题,边框等。
- style主要是用在 View 上的,当你在 view 上设置 style 的时候,LayoutInflater 会读取 该 style 的内容并在任意单独设置的样式之前把该内容设置到 AttributeSet 中。
- dpi、sp、px的区别以及转换关系
- raw和assets文件夹的作用,二者有何区别
- Android系统如何在多个资源文件夹下查找匹配最合适的资源
- 系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
虚拟机
- Java内存模型
- Android虚拟机的特点
- Dalvik和Art的区别
- 熟悉垃圾回收的实现机制,了解虚拟机的GC类型
以上问题部分答案: JVM理解其实并不难!
View相关
- 常用组件的使用:ListView、RecyclerView及Adapter的使用
- View之间的继承关系
- Invalidate与postInvalidate的区别
- 自定义View的实现方式(根据项目经验询问相关组件)。
- onMeasure/onLayout/onDraw的作用
- Paint、Matrix、Shader等绘制相关类的方法作用
- 详细描述事件分发机制
动画
- Android有哪些动画的实现方式
- 补间动画 Tween Animation
- 帧动画 Frame Animation
- Interpolator类的意义和常用的Interpolator
- 这个类主要是用来控制android动画的执行速率
- AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
- AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
- CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
- DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速
- LinearInterpolator 在动画的以均匀的速率改变
- ViewAnimation与属性动画有什么区别
- 属性动画真实的改变了View的显示,事件响应的区域也改变,而ViewAnimation的事件区域不会随动画移动。
- 如何自定义ViewAnimation
- 属性动画的实现原理
- 通过传入的对象属性名字,反射调用set函数修改对象属性值。
图片处理
- 一般项目中如何加载大图
- 图片压缩的方式
- 如何不压缩图片加载高清图
- 图片加载过程中,一般会使用缓存,这个缓存的主要作用是什么
- 谈谈自己熟悉的图片加载框架
项目经验
开发工具
- 代码管理工具:SVN、Git
- 常用的调试工具:Hierarchy Viewer、DDMS等
- CI工具:Lint检查,FindBugs、Jenkins
- 内存分析工具:dumpsys、memoinfo、MAT
项目工程
- APP更新策略:推送或者拉取?
- 如何统一处理错误崩溃
- 如何进行用户行为收集
- 日志管理有哪些要点?(Debug包开放,release包关闭,错误日志反馈)
- 打包方式Ant、Maven、Gradle
- 机型适配情况
开放平台
- 是否使用过第三方平台
- 常用开放平台的熟悉度(微信、QQ、微博、支付宝等常用的支付和分享)
- 是否进行过对第三方平台的统一封装?
- 是否自己开发过SDK?
设计相关
- 有哪些常用的设计模式、设计原则
- 设计模式在Android源码中的应用
- 设计模式在项目中的应用
- 项目中的分包方式
- MVC在android中的应用,利弊
- android项目中的常见层次结构,包划分
- 有没有设计过项目中的层级结构、包划分