Android/Java面试题整理
Posted 南飞的孤雁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android/Java面试题整理相关的知识,希望对你有一定的参考价值。
1,阐述TouchEvent处理机制
Activity.dispathTouchEvent→ViewGroup.diapatchTouchEvent→ViewGroup.onInterceptTouchEvent
→View.dispatchTouchEvent→View.onTouchEvent→ViewGroup.onTouchEvent→Activity.onTouchEvent
详见: http://blog.csdn.net/zhanglong_daniel/article/details/50439890
2,invalidate 与 postInvaliate区别
- invalidate只能在UI线程中使用
- postInvalidate可以在非UI线程中使用
3,BroadcastReceiver的生命周期
BroadcastReceiver的生命周期只有一个回调方法:onReceive(Context context, Intent intent);
无法进行耗时操作,即使启动线程处理,也是出于非活动状态,有可能被系统杀掉。如果需要进行耗时操作,可以启动一个service处理。
4,Java中byte,char,short,int,long,float,double等数据类型的长度
- byte占1个字节,8位
- char占2个字节,16位
- short占2个字节,16位
- int占4个字节,32位
- long占8个字节,64位
- float占4个字节,32位
- double占8个字节,64位
5,int与Integer的区别
- int是基本数据类型,Integer是int的封装类,是引用类型;
- int声明的变量不需要实例化,Integer声明的变量需要实例化;
- int的默认值是0,Interger的默认值是null;
- int类型只能进行数值运算,Integer提供了很多整数相关的操作方法,如和String进行转换等。
6,线程状态转换
7,线程wait(),sleep(),yield()的区别
- sleep()使当前线程进入阻塞态,阻塞时长由程序指定,让其他线程继续执行,不释放“锁标志”;
- yield()使当前线程回到就绪态,时长无法确定,只能使同优先级的线程获得执行机会,也不释放“锁标志”;
- wait()是Object类的方法,当某对象调用wait()方法后,引用此对象的线程会释放掉“锁标志”,使该对象的synchronized数据可以被其他线程访问,同时当前线程进入阻塞态,调用此对象的notify()/notifyAll()后,线程进入就绪态。
8,android 2D动画框架实现原理
Android动画框架的基本原理就是把子View动画的播放/绘制交给父View去处理而不是让子View本身去绘制。
这种从更高的层次上去控制的方式便于把动画机制做成一个易用的框架,如果用户要在某个view中使用动画,只需要在xml描述文件或代码中指定就可以了,从而把动画的实现和View本身内容的绘制(象TextView里面的文字显示)分离开了,起到了减少耦合和提高易用性的效果。
9,HashMap原理
(1)key为null时,使用entryForNullKey单独存储,key非空时,使用数组存储;
(2)table的负载因子loadfactor默认为0.75,不可修改;
(3)元素在数组中的位置由key值进行secondaryHash后,再和数组的length-1进行与运算得到的;
(4)计算出的元素位置相同时,新增元素放在放在链表的最前面;
(5)如果HashMap的大小超过了负载因子(load factor)定义的容量,将会创建原来HashMap大小的两倍的数组,来重新调整map的大小,并将原来的对象放入新的数组中,这个过程叫作rehashing,因为它重新调用hash方法找到新的位置;
(6)当重新调整HashMap大小时,存在条件竞争,若两个线程都发现HashMap需要重新调整大小,它们会同时调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,就会出现死循环,所以应避免在多线程的环境下使用HashMap。
(7)HashMap进行同步:Map m = Collections.synchronizeMap(hashMap);
(8)HashMap的迭代器(Iterator)是fail-fast迭代器,所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,迭代器本身的remove()方法移除元素也有可能(取决于JVM)抛出ConcurrentModificationException异常。
10,android中View的绘制
从RootView逐层绘制:measure(int,int)→layout(int,int,int,int)→draw→drawChild
11,android工程方法数超过64KB(65535)问题解决方案
- 代码混淆
- sdk裁减
- multi-dex
12,Java垃圾回收机制
要点 | 描述 |
---|---|
核心功能 | 1,定位需要回收的内存; 2,回收内存空间,供程序再次使用 |
常用算法 | 1,引用计数;2,标记-清除;3,标记-整理; 4,复制;5,增量收集;6,分代收集 |
触发条件 | 1,应用程序空闲时触发,因为GC在优先级最低的线程中执行; 2,内存不足时触发,GC一次后不能满足内存需求,再次进行,若仍无法满足需求,抛“OOM” |
减少GC措施 | 1,不显示调用GC;2,减少临时变量;3,主动清理置空不用的对象; 4,减少封装类型;5,减少静态变量;6,避免对象清理时间过于集中 |
13,ListView流畅度优化
- convertView复用;
- 分页加载;
- 滑动过程中停止图片加载。
14,A activity启动B activity和B activity返回A activity的生命周期执行过程
A启动B:A.onPause()→B.onCreate()→B.onStart()→B.onResume()→A.onStop
B返回A:B.onPause()→A.onRestart()/A.onCreate()→A.onStart()→A.onResume()→B.onStop()
15,startService 和bindService区别
- | startService | bindService |
---|---|---|
Service生命周期 | onCreate()→ onStartCommand()→ onDestroy() | onCreate()→ onBind()→ onUnBind()→ onDestroy() |
退出方式 | stopService() Service.stopSelf() | unbindService() 调用者退出 |
通信方式 | 单向:Activity→ Service | 双向:ServiceConnection |
使用场景 | 启动本地服务 | 启动远程服务 |
16,override和overload的区别
- override和overload是Java多态性的不同表现。
- override是父类与子类之间多态性的一种表现,overload是一个类中多态性的一种表现。
override(重写) | overload(重载) |
---|---|
1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 | 1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。 3、存在于父类和子类、同类中。 |
17,静态内部类和非静态内部类的区别
静态内部类 | 非静态内部类 |
---|---|
不持有外部类的引用; 实例化不依赖于外部类实例; 可以有静态成员; 可访问外部类静态变量,不可访问外部类非静态变量 | 默认持有外部类的引用,存在造成内存泄露的隐患; 实例化依赖于外部类实例; 不能有静态成员,除非是final的; 可访问外部类静态变量,也可访问外部类非静态变量 |
18,AsyncTask原理
- 根据CPU数量维护一个线程池,任务队列最多支持128个任务;
- 在子线程中执行任务,执行进度和结果通过handler传递到主线程。
19,Java中可能造成栈溢出的原因
- 递归调用;
- 有大量循环或死循环;
- 全局变量太多;
- 数组,List,Map数据太大;
20,Android中常用的设计模式
设计模式 | 示例 |
---|---|
MVC | |
适配器模式(Adapter) | AdapterView |
建造者模式(Builder) | AlertDialog.Builder NotificationCompat.Builder |
观察者模式(ObServer) | Listener |
工厂模式(Factory) | BitmapFactory |
单例模式(Singleton) | Application |
21,ANR
ANR类型 | 说明 |
---|---|
类型 | KeyDispatchTimeout (5 seconds):按键或触摸事件在特定时间内无响应; BroadcastTimeout (10 seconds):BroadcastReceiver在特定时间内无法处理完成; ServiceTimeout (20 seconds):Service在特定的时间内无法处理完成; |
原因 | 当前事件没有机会得到处理(UI线程在处理上一事件中或者Looper被阻塞); 当前事件正在处理,耗时太长,没有及时完成; |
避免 | 耗时操作放入子线程执行(数据库操作,I/O,连接网络或其他可能阻碍UI线程的操作) |
分析 | 分析log(/data/anr/traces.txt); review代码; 确认成因(I/O wait?Block?Memoryleak?) |
22,Android耗电的主要原因和优化方案
原因:
- 大数据量的传输;
- 不停地网络切换;
- 解析大量的文本数据。
优化:
- 在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序;
- 使用效率高的数据格式和解析方法,推荐使用JSON和Protobuf; 在进行大数据量下载时,尽量使用GZIP方式下载;
- 对定位要求不是太高的话尽量不要使用GPS定位,可能使用wifi和移动网络cell定位即可;
- 尽量不要使用浮点运算;
- 获取屏幕尺寸等信息可以使用缓存技术,不需要进行多次请求;
- 使用AlarmManager来定时启动服务替代使用sleep方式的定时任务。
23,Unicode与UTF-8的关系
- Unicode是字符集
- UTF-8是该字符集的一种编码方式
24,软引用,弱引用,虚引用
引用类型 | 说明 |
---|---|
SoftReference (软引用) | 内存空间足够,垃圾回收器就不会回收,内存空间不足,就会回收对象的内存。 可用来实现内存敏感的高速缓存。 |
WeakReference (弱引用) | 垃圾回收器一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。 |
PhantomReference (虚引用) | 虚引用就和没有任何引用一样,在任何时候都可能被垃圾回收。 虚引用主要用来跟踪对象被垃圾回收的活动。 虚引用必须和引用队列(ReferenceQueue)联合使用。 |
25,Android内存回收优先级
进程类型 | 说明 |
---|---|
IMPORTANCE_FOREGROUND 前台进程 | 目前正在屏幕上显示的进程和一些系统进程。 |
IMPORTANCE_VISIBLE 可见进程 | 可见进程是一些不在前台,但用户依然可见的进程,比如输入法、天气、时钟等。 |
IMPORTANCE_SERVICE 服务进程 | 拨号、邮件存储之类的。 |
IMPORTANCE_BACKGROUND 后台进程 | 启动后被切换到后台的进程。 |
IMPORTANCE_EMPTY 空进程 | 没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。 |
按home退出,程序保留状态为后台进程;按返回键退出,程序保留状态为空进程。
26,TCP/IP三次握手(Three-Way Handshake)过程
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
27,TCP/IP四次挥手(Four-Way Wavehand)过程
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
以上是关于Android/Java面试题整理的主要内容,如果未能解决你的问题,请参考以下文章