2019Android 最新面试题 持续更新

直接入正题,遇到的面试题记录一下,希望对别的童靴有帮助,没有先后高低优先级之分,想起来那个就写上了。

1,SQL getReadableDatabase  或者getWritableDatabase 需要加同步锁吗?如果需要哪一个要加

答案:都不需要,这个是我自己通过源码得来的。源码内部已经在两种方法都加过了

2,算法题 说一个除了冒泡以外的排序

答案:这个网上有的是,好多种算法,但是你要说你会实现的。(我说的选择,但是面试官说这不就是冒泡吗,一笑而过)

3,handler 的sendMessage和post 方法具体的区别

sendMessage一些列方法底层都是通过把Message 放到looper的队列当中,post 是把runnable对象封装成一个message对象,message的callback 对象就是一个runnable 类型的,然后调用sendMessage方法,最后handler dispatchMessage的时候 先判断message的callback 不为空,message.callback.run();进行回调,注意这里只是调用run方法,并不是start启动线程。

4,handler怎么在子线程中创建,有几种方法?

handler 创建需要一个looper对象,子线程中默认没有looper对象,我们可以通过looper.prepare()创建当前线程的looper对象,然后就可以进行handler对象创建。第二种方法可以通过handler的构造函数传一个looper进去,常见的 looper.getMainLooper()。

如果不使用了,可以通过looper.quit进行退出。

5,GC的算法了解么

计数加1算法,java用的不是这种算法,但是你要知道,java用的是根搜索算法,这个东西建议详细去了解一下,拓展还有人问GC的根搜索算法,GCRoot是什么,方法区的静态变量,常量,虚拟机栈中引用的变量,native 方法引用的对象。

6,栈是线程共享的吗

答案:栈一般说的是虚拟机栈,是线程私有的,线程共享的是方法区和堆区,方法区存放的是静态变量和常量,还有类的信息等等,堆区存放的是我们对象的实体

7,子线程可以弹toast吗?

答案:子线程允许弹toast,但是toast实现原理是通过handler队列来实现的,所以如果子线程需要Toast,必须要保证子线程中有一个looper队列,否则抛异常,补充 :子线程弹弹Toast和子线程更新UI不是一个check原理,Ui是viewRootImpl check线程,Toast是check Looper队列。

 

未完待续 

 
 
 

 

你可能感兴趣的:(Android)