1、什么情况下要使用AIDL
2、面向对象思想和面向过程思想的区别:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,对象包括属性和行为。
面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
3、Handler机制
Handler对象发送消息,调用MessageQueue(消息队列)的enqueueMessage()方法来让消息进入队列,Looper.loop()方法循环检测消息队列中是否有新消息入队。如果有则将这个消息取出,将它传递到msg.target(Handler)的dispatchMessage()方法中,内部调用handleMessage()。
注:每个线程中最多只会有一个Looper对象,一个Looper对应了一个MessageQueue
详细:Android异步消息处理机制完全解析,带你从源码的角度彻底理解
4、HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap
Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所有线程竞争同一把锁;而 ConcurrentHashMap 不仅线程安全而且效率高,因为它包含一个 segment 数组,将数据分段存储,给每一段数据配一把锁,也就是所谓的锁分段技术(存在于Java7)。Java 7和8有区别,在8中ConcurrentHashMap摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法 + synchronized。
HashMap线程不安全:因为多线程会导致 HashMap 的 Node 链表形成环形数据结构,一旦形成环形数据结构,Node 的 next 节点永远不为空,就会在获取 Node 时产生死循环。
当使用 Collections.synchronizedMap(new HashMap()) 进行包装后就返回一个线程安全的SynchronizedMap,而在SynchronizedMap类中使用了synchronized同步关键字来保证对Map的操作是线程安全的。
要保证线程安全的话使用ConcurrentHashMap,性能较好,详情:如何线程安全的使用HashMap
用法:
Map<Long, String> conMap = new ConcurrentHashMap<Long, String>();
for (long i = 0; i < 15; i++) {
conMap.put(i, i + "");
}
for (Entry<Long, String> entry : conMap.entrySet()) {
long key = entry.getKey();
if (key < 10) {
conMap.remove(key);
}
}
for (Entry<Long, String> entry : conMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}