Android工程师面试题大全(2)

函数接口不同
Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。 Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。

Iterator支持fail-fast机制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

ail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

5、接口的注意点

接口中的字段全部默认为 public static类型。

接口中的方法全部默认为 public类型。

接口中可以申明内部类,而默认为public static,正因为是static,只是命名空间属于接口,代码逻辑不属于接口。所以不违法接口定义。

接口本身可以申明为public或者缺省。

抽象类继承自某接口。如果在抽象类中实现了父类(接口)中的方法,在其子类可以不用实现,否则在子类必须实现。

6、final方法
将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为inline调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。

Android知识点 1、Handler机制

Handler对Activity finish影响。
在开发的过程中碰到一个棘手的问题,调用Activity.finish函数Acitivity没有执行生命周期的ondestory函数,后面查找半天是因为有一个handler成员,因为它有一个delay消息没有处理,调用Activity.finish,Activity不会马上destory,所以记得在Ativity finish前清理一下handle中的未处理的消息,这样Activity才会顺利的destory

Looper
通过调用Looper.prepare()创建Looper()对象并绑定到ThreadLocal变量中。
Looper里面包含了messageQueue。
构造器如下: private Looper() { mQueue = new MessageQueue(); mRun = true; mThread = Thread.currentThread(); }

loop()函数
1)从Looper中取出MessageQueue;
2)循环从MessageQueue中取出Message;
3)从Message中取出Target(Handler对象);
4)调用tartget的dispatchMessage分发消息。

Handler对象
重要成员变量: final MessageQueue mQueue; final Looper mLooper; final Callback mCallback; //用于回调 Handler对象在发送消息的时候,将MSG的target变量设为自己。这样在Looper对象循环取出msg的时候就可以调用对应handler的dispatchMessage()。此函数分发消息的优先级如下:
Message在创建的时候调用Obtain设置了Callback。
Handler在创���的时候传入了Callback。
交给Handler子类的HandleMessage处理(通常的做法)。

2、Android启动模式

standard和singleTop模式。
这两种比较简单。创建Activity放入当前的任务栈中,若当前是singleInstace,则放入设置的任务栈中。其中如果Activity在栈顶,则调用onNewIntent。

singletask:栈内复用模式。不是在当前任务栈中查找是否存在,实际过程如下:

查找该Activity所需的任务栈是否存在(由taskAffinity控制,或者默认为包名)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5e94b9085b151ff7b4c37efe32f6a9c0.html