2013-5-2号补充:
1.View和ViewGroup的关系
2.如何定位和解决Andorid的内存溢出问题
3.一个有N个元素的一维数组(A[0],A[1], ..., A[n-1]),设计一个算法求解该数组最大子数组。(要求时间复杂度是O(n))
4.用Java代码实现判断一个字符串中是否包含另一个字符串,不要用jdk中String的indexOf方法。
5.用Java实现一个Singleton.
6.简述Observer设计模式,并画出Observer模式的典型结构类图
9.用最有效率的方法算出2乘以8等于几?
10.静态成员类、非静态成员类有什么区别?什么是匿名内部类?
11.Handler机制的原理,内部是如何实现的,消息队列的实现机制?
12.什么是ANR,如何定位和避免?
14.简述Android的启动过程
15.如何加载ndk库?如何在jni中注册native函数,有几种注册方法?
17.简述软件编译流程和发布流程
18.是否编译过android源码和linux内核源码
19.写一个归并排序数组
20.自定义控件相关
21.缓存实现
22.线程同步(生产者 消费者)
23.符号匹配(栈)
Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的。所有View的子类成为”Widget”,所有ViewGroup的子类成为”Layout”。View和ViewGroup之间采用了组合设计模式,可以使得“部分-整体”同等对待。ViewGroup作为布局容器类的最上层,布局容器里面又可以有View和ViewGroup。
2.如何定位和解决Andorid的内存溢出问题
3.一个有N个元素的一维数组(A[0],A[1], ..., A[n-1]),设计一个算法求解该数组最大子数组。(要求时间复杂度是O(n))
public class a {
public static void main(String args[]) {
int a[]={84,40,16,3,10,49,28,76,94,70};
int n;
int min=a[0];
int i;
int max=a[0];
for(n=0;n<=9;n++) {
if(max<a[n])
max=a[n];
}
for(i=0;i<=9;i++) {
if(min>a[i])
min=a[i];
}
System.out.print("max="+max);
System.out.print("min="+min);
}
}
4.用Java代码实现判断一个字符串中是否包含另一个字符串,不要用jdk中String的indexOf方法。
boolean a = s.contains("??");
5.用Java实现一个Singleton.
publci class MyClass{
private MyClass(){}
public static class SingleTon{
public static MyClass instance = new MyClass();
}
public static MyClass getInstance(){
return SingleTon.instance;
}
}
6.简述Observer设计模式,并画出Observer模式的典型结构类图
观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
7.& 和&&的区别
&和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行,直到整个条件语句执行完为止。
8.什么是dpi,px,sp?适配是如何做的,为什么?
9.用最有效率的方法算出2乘以8等于几?
2<<3
10.静态成员类、非静态成员类有什么区别?什么是匿名内部类?
类的静态成员每个类只有一个,非静态成员每个对象一个。
11.Handler机制的原理,内部是如何实现的,消息队列的实现机制?
andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
1.Handler创建消息
每一个消息都需要被指定的Handler处理,通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。消息的创建流程如图所示。
2.Handler发送消息
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。
Handler、Looper、MessageQueue的初始化流程如图所示:
3.Handler处理消息
UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。
子线程通过Handler、Looper与UI主线程通信的流程如图所示。
12.什么是ANR,如何定位和避免?
13.APK之间互相传递数据
通过AnroidManifest中设置shareUserId
14.简述Android的启动过程
15.如何加载ndk库?如何在jni中注册native函数,有几种注册方法?
RegisterNatives 注册
16.如何收集软件崩溃信息?17.简述软件编译流程和发布流程
18.是否编译过android源码和linux内核源码
19.写一个归并排序数组
- public class MergeSortTest {
- public static void main(String[] args) {
- int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
- print(data);
- mergeSort(data);
- System.out.println("排序后的数组:");
- print(data);
- }
- public static void mergeSort(int[] data) {
- sort(data, 0, data.length - 1);
- }
- public static void sort(int[] data, int left, int right) {
- if (left >= right)
- return;
- // 找出中间索引
- int center = (left + right) / 2;
- // 对左边数组进行递归
- sort(data, left, center);
- // 对右边数组进行递归
- sort(data, center + 1, right);
- // 合并
- merge(data, left, center, right);
- print(data);
- }
- /**
- * 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序
- *
- * @param data
- * 数组对象
- * @param left
- * 左数组的第一个元素的索引
- * @param center
- * 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引
- * @param right
- * 右数组最后一个元素的索引
- */
- public static void merge(int[] data, int left, int center, int right) {
- // 临时数组
- int[] tmpArr = new int[data.length];
- // 右数组第一个元素索引
- int mid = center + 1;
- // third 记录临时数组的索引
- int third = left;
- // 缓存左数组第一个元素的索引
- int tmp = left;
- while (left <= center && mid <= right) {
- // 从两个数组中取出最小的放入临时数组
- if (data[left] <= data[mid]) {
- tmpArr[third++] = data[left++];
- } else {
- tmpArr[third++] = data[mid++];
- }
- }
- // 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)
- while (mid <= right) {
- tmpArr[third++] = data[mid++];
- }
- while (left <= center) {
- tmpArr[third++] = data[left++];
- }
- // 将临时数组中的内容拷贝回原数组中
- // (原left-right范围的内容被复制回原数组)
- while (tmp <= right) {
- data[tmp] = tmpArr[tmp++];
- }
- }
- public static void print(int[] data) {
- for (int i = 0; i < data.length; i++) {
- System.out.print(data[i] + "\t");
- }
- System.out.println();
- }
- }
20.自定义控件相关
21.缓存实现
22.线程同步(生产者 消费者)
23.符号匹配(栈)
24.还问了下拉刷新和分页加载的实现机制
<—————————>
《国际化产品部 ES团队》
25.Handler 与 Looper的关系? 消息队列原理?
26.android的启动过程
27.ListView优化方式?
28.imageLoader原理?
29.两个应用之间,A ——》B——》A,根据Activity启动模式,分别说一下现象。
30.说说你做的这些App中,遇到的问题和收获?
31.ListView 优化,如何做到快速滑动列表,图片也随着加载,并且不卡顿?
32.java的GC机制。
33.说一下rgb_565与rgb_8888
<——————>
天生我才必有用,千金散去还复来!
浙公网安备 33010602011771号