10道经典面试题及答案(每日一道面试题)
10道经典面试题及答案(每日一道面试题)频繁触发GC,会降低了应用的性能应用可用内存减少,增加堆内存压力Android 内存泄漏的原因以及解决方案 1、内存泄漏指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收2、内存泄漏的影响:
码个蛋(codeegg)第 622 次推文
来了老弟~ 知道大家都是周末还是不忘学习的好同学!
码仔,今天就给大家带来了《每日一道面试题》的第二期:
01
Android 内存泄漏的原因以及解决方案
1、内存泄漏指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收
2、内存泄漏的影响:
-
应用可用内存减少,增加堆内存压力
-
频繁触发GC,会降低了应用的性能
-
到一定程序会导致内存溢出错误
3、Android开发中常见内存泄漏及解决办法
-
静态变量生命周期与应用的生命周期一样,如果静态变量持有某个Activity的上下文,则对应Activity无法释放,导致内存泄漏(单例模式) 解决办法:使用Application的上下文
-
匿名内部类与非静态内部类因为都会持有外部类引用,当执行异步操作易导致内存泄漏 解决办法:将非静态内部类转为静态内部类 WeakReferenct的方式
-
Handler消息队列存在延时消息导致内存泄漏 在onDestroy方法中调用Handler相应的方法移除回调和删除消息
-
各种注册的监听器忘记移除导致内存泄漏 解决办法:在onDestroy方法中取消注册
-
资源对象未关闭导致内存泄漏,如(IO 数据库,Bitmap等) 解决办法:及时关闭资源
-
属性动画未取消导致内存泄漏(如无限轮播图效果) 解决办法:onDestroy方法中取消动画
-
其他解决办法:使用AAC框架
4、内存泄漏排查工具: AS Monitor MAT LeakCanary
5、扩展: Java内存管理,GC
02
HashMap和Hashtable的区别
HashMap是map接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许 key和 value,而hashtable不允许。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,由于非线程安全,效率上可能高于Hashtable。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。但是如果使用Java 5或以上的话,可以用ConcurrentHashMap代替Hashtable。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差。
03
ScrollView嵌套ListView的解决方案及其原理
自定义ListView 解决:重写其中的onMeasure方法
原因: ScrollView默认把Childview设置为UNSPEFEIED模式 而该模式下的ListView给自己的测量的高度就是第一个item的高度.原理:
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2 MeasureSpec.AT_MOST);
这个方法的作用是根据大小和模式来生成一个int值 这个int值封装了模式和大小信息.
首先MeasureSpec类是View的一个静态内部类 MeasureSpec类封装了从父布局到子布局传递的布局需求. 每个MeasureSpec对象代表了宽度和高度的要求.
MeasureSpec用int类型表示 前2位代表模式 后30位代表大小. 第一个参数
Integer.MAX_VALUE >> 2:Integer.MAX_VALUE
获取到int的最大值 但是表示大小的值size是int数值的底30位 所以把这个值右移两位 留出高两位表示布局模式. 此时这个值仍旧是一个30位所能表示的最大数 用该数作为控件的size 应该足够满足控件大小的需求. 第二个参数MeasureSpec.AT_MOST:表示这个控件适配父控件的最大空间.
(以下三种仅供参考 不推荐使用) 2.手动设置ListView高度 3.使用单个ListView取代ScrollView中所有内容 4.使用LinearLayout取代ListView
参考资料:
https://juejin.im/entry/5979ab4d5188253e3271c953
https://juejin.im/post/5a322cbf6fb9a045204c3da1
04
String,StringBuilder,StringBuffer的区别
可变不可变 String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。 StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对 象;使用场景:对字符串经常改变情况下,主要方法:append,insert等。
线程是否安全 String:对象定义后不可变,线程安全。 StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区 大量数据。 StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。
共同点 StringBuilder 与 StringBuffer 有公共父类AbstractStringBuilder(抽象类)。StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder 中的公共方法,如 super.append(...)。 只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。
05
谈谈你的职场规划
主要看的是面试者对自己的定位,这样便于让企业去识别这个人的培养方向。问完这个问题会有第二个问题你有没有想过如何达成你的目标,这个通常看面试者的规划能力,说的越详细越好。
有目标并有清晰规划的人,通常这类人自驱力比较强的人。一般没有明确目标和清晰规划的人我是不会招的。
还有企业文化,通常我问面试者是否认同我们的企业文化,不认同技术再好也不行。
06
结束语
如果你有好的答案可以提交至:
https://github.com/codeegginterviewgroup/CodeEggDailyInterview
往期文章:
-
Android 面试题:Handler、自定义View、Java三大特性、分发机制、动画(第1期)
近期文章:
-
腾讯面试我竟倒在一个警察抓小偷题上
-
Flutter 入门指北之手势处理和动画
-
Google官宣:Flutter全平台称霸
今日问题:
大家觉得今日份面试题有帮助到大家吗?
快来码仔社群解锁新姿势吧!社群升级:Max你的学习效率