这是一次在qq群里,有群友拍照贴上来的Android面试题,有不少高手进行了部分解答,后来,我做了一次系统整理,当然某些部分也加了些自己的理解,有不同意见的同学,欢迎讨论。
题目如下:
下面是我总结的答案:
一,基本数据类型的大小(单位:bit)
Byte:8
Short:16
Char:16
Int:32
Long:64
分析:两个注意点:1,以bit为单位;2,Char是2字节,与C语言的1字节,不要混淆了。
二,字符串比较,s1==s2的结果
答案:结果是false。原因:String是引用类型的,不同对象有不同的地址,两个对象的地址,是不同的。
三,Thread类
下面哪个动作,明确的停止一个执行中的线程?
wait()
notify()
yield()
suspend()
sleep()
分析:
wait():线程调用该方法后,线程状态将从running 变为 waiting。
notify():线程调用notify(),将随机的从wait队列中挑选一个线程,将其状态从waitting 变为 runningable。
yield:调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间. 调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间。
suspend()方法就是将一个线程挂起(暂停)。
sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象。
答案:suspend()
四,编码能力
1,类的设计。鸟、兽、蝙蝠的故事,3个类一个接口。
//兽类,能吃肉
public abstract class Beast {
public abstract void EatMeat();
}
//飞行接口
public interface InterfaceFly{
void Fly();
}
//鸟类,有飞行能力
public class Bird implements InterfaceFly{
public void Fly(){}
}
//蝙蝠,是兽类,能吃肉;同时,它还拥有飞行能力
public class Bat extends Beast implements InterfaceFly {
public void EatMeat(){}
public void Fly(){}
}
2,算法,洗牌,有序数组转无序
提供了3种方式,核心都是使用随机数。
//随机取两张牌,交换位置。
private int[] shuffle_mix(int[] ayCardValue){
Random random = new Random();
int temp=0;
int index1=0;
int index2=0;
int len=ayCardValue.length;
for(int i=0;i<len;i++)
{
index1 = random.nextInt(len);
index2 = random.nextInt(len);
temp = ayCardValue[index1];
ayCardValue[index1] = ayCardValue[index2];
ayCardValue[index2] = temp ;
}
return ayCardValue;
}
//把第一位的牌与一个随机位置的牌进行交换
private int[] shuffle_buluma(int[] ayCardValue){
Random random = new Random();
int temp=0;
int index=0;
int len=ayCardValue.length;
for(int i=0;i<len*2;i++)
{
index = random.nextInt(len);
temp = ayCardValue[0];
ayCardValue[0] = ayCardValue[index];
ayCardValue[index] = temp ;
}
return ayCardValue;
}
//随机取走一张牌,用最后一张填充
private int[] shuffle_ahui(int[] ayCardValue){
int index_ramdom=0;
int len=ayCardValue.length;
int[] retCard=new int[len];
Random random = new Random();
for(int i=0;i<len;i++)
{
index_ramdom = random.nextInt(len-i);
retCard[i]=ayCardValue[index_ramdom];//转移
ayCardValue[index_ramdom] = ayCardValue[len-i-1];//补充
}
return retCard;
}
五,Android
1,Service的生命周期方法
通过startService启动: Service会经历 onCreate –> onStart 。
stopService的时候直接onDestroy 。
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。 下次调用者再起来仍然可以stopService。
通过bindService启动: Service先运行onCreate(),然后执行onBind(),这个时候 调用者和Service绑定在一起。
调用者退出了,Service就会调用onUnbind–>onDestroyed
2,分辨率
hvga:480*320 (half vga)
qvga:320*240 (1/4 vga)
wvga:800*480 (wide vga)
3,aidl概念及作用
aidl: Android Interface definition language的缩写,是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。