简单记录一下经历过的面试问题(T▽T)
持续更新中…
java线程控制中sleep和wait的区别?
1、sleep是Thread的静态方法,wait是对象的方法。
2、sleep不释放同步锁,wait释放同步锁。
3、sleep和wait都可以设置时间,到点后自动唤醒。sleep可以在任何地方使用,在哪个线程里调用sleep函数哪个线程就休眠。wait只能在同步函数或同步代码块内使用,调用哪个线程对象的wait方法那个线程就进入等待,可以通过notify和notifyAll唤醒。
4、sleep必须捕获异常,wait则不用。
Activity启动的几种模式?
1、standard:默认启动模式,每次启动就将一个新Activity实例压栈,同一Activity可以有多个实例。
2、SingleTop:当目标Activity位于栈顶时不创建新实例直接启动,否则创建新实例压栈。和standard类似,同一Activity可以拥有多个实例。
3、singleTask:在同一个任务栈内只会存在一个实例,如果目标Activity位于栈顶则直接启动,如果目标Activity不位于栈顶则把它上面的Activity都出栈,将它移动到栈顶然后启动。
4、singleInstance:在整个系统中只会存在一个实例,启动该模式下的Activity时,系统会单独为它创建一个任务栈,并且只有它一个Activity。
mvc、mvp、mvvp模式分别是什么,有什么区别?
参考:android MVC && MVP && MVVM分析和对比
内存泄露
在Java 中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用。
Handler可能导致内存泄漏的一种流程:
Activity创建匿名Handler类,Handler类延时发送一个message,此时如果Activity被结束,则因message->handler->Activity这个引用持有链导致GC无法回收Activity,产生内存泄露。
总结:内部非静态类的生命周期长于外部类时,会引发内存泄漏。
参考:Handler内存泄露原理及解决方法
java有哪几种引用类型,各自的含义?
强引用:通常声明的引用都是强引用,只要某个对象与至少一个强引用相关联,GC就不会回收它,哪怕内存不足抛出oom异常。
软引用(SoftReference<Object> obj
) 当一个对象最多只存在软引用时,GC会在内存不足时回收它,可以防止oom。
弱引用(WeakReference<Object> obj
) 当一个对象最多只存在弱引用时,无论内存是否充足,GC都会在下次执行内存回收时回收它。
虚引用(ReferenceQueue<Object> obj
) 一个对象同虚引用关联之后,等同于没有和任何引用相关联。
延伸问题:有没有做过对程序进行性能优化?通过软引用列表关联图片或其它大对象来做缓存也是程序性能优化之一。
参考:Java 如何有效地避免OOM:善于利用软引用和弱引用
广播
找到新工作了,断更 (逃