快捷搜索:  汽车  科技

10道经典面试题及答案(每日一道面试题)

10道经典面试题及答案(每日一道面试题)频繁触发GC,会降低了应用的性能应用可用内存减少,增加堆内存压力Android 内存泄漏的原因以及解决方案 1、内存泄漏指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收2、内存泄漏的影响:

10道经典面试题及答案(每日一道面试题)(1)

码个蛋(codeegg)第 622 次推文

来了老弟~ 知道大家都是周末还是不忘学习的好同学!

码仔,今天就给大家带来了《每日一道面试题》的第二期:

01

Android 内存泄漏的原因以及解决方案

1、内存泄漏指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被JVM回收

2、内存泄漏的影响:

  1. 应用可用内存减少,增加堆内存压力

  2. 频繁触发GC,会降低了应用的性能

  3. 到一定程序会导致内存溢出错误

3、Android开发中常见内存泄漏及解决办法

  1. 静态变量生命周期与应用的生命周期一样,如果静态变量持有某个Activity的上下文,则对应Activity无法释放,导致内存泄漏(单例模式) 解决办法:使用Application的上下文

  2. 匿名内部类与非静态内部类因为都会持有外部类引用,当执行异步操作易导致内存泄漏 解决办法:将非静态内部类转为静态内部类 WeakReferenct的方式

  3. Handler消息队列存在延时消息导致内存泄漏 在onDestroy方法中调用Handler相应的方法移除回调和删除消息

  4. 各种注册的监听器忘记移除导致内存泄漏 解决办法:在onDestroy方法中取消注册

  5. 资源对象未关闭导致内存泄漏,如(IO 数据库,Bitmap等) 解决办法:及时关闭资源

  6. 属性动画未取消导致内存泄漏(如无限轮播图效果) 解决办法:onDestroy方法中取消动画

  7. 其他解决办法:使用AAC框架

4、内存泄漏排查工具: AS Monitor MAT LeakCanary

5、扩展: Java内存管理,GC

10道经典面试题及答案(每日一道面试题)(2)

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算法都大概一样,所以性能不会有很大的差。

10道经典面试题及答案(每日一道面试题)(3)

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

10道经典面试题及答案(每日一道面试题)(4)

04

String,StringBuilder,StringBuffer的区别

可变不可变 String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。 StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对 象;使用场景:对字符串经常改变情况下,主要方法:append,insert等。

线程是否安全 String:对象定义后不可变,线程安全。 StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区 大量数据。 StringBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。

共同点 StringBuilder 与 StringBuffer 有公共父类AbstractStringBuilder(抽象类)。StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder 中的公共方法,如 super.append(...)。 只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。

10道经典面试题及答案(每日一道面试题)(5)

05

谈谈你的职场规划

主要看的是面试者对自己的定位,这样便于让企业去识别这个人的培养方向。问完这个问题会有第二个问题你有没有想过如何达成你的目标,这个通常看面试者的规划能力,说的越详细越好。

有目标并有清晰规划的人,通常这类人自驱力比较强的人。一般没有明确目标和清晰规划的人我是不会招的。

还有企业文化,通常我问面试者是否认同我们的企业文化,不认同技术再好也不行。

06

结束语

如果你有好的答案可以提交至:

https://github.com/codeegginterviewgroup/CodeEggDailyInterview

10道经典面试题及答案(每日一道面试题)(6)

往期文章:

  • Android 面试题:Handler、自定义View、Java三大特性、分发机制、动画(第1期)


近期文章:

  • 腾讯面试我竟倒在一个警察抓小偷题上

  • Flutter 入门指北之手势处理和动画

  • Google官宣:Flutter全平台称霸

今日问题:

大家觉得今日份面试题有帮助到大家吗?

10道经典面试题及答案(每日一道面试题)(7)

快来码仔社群解锁新姿势吧!社群升级:Max你的学习效率

10道经典面试题及答案(每日一道面试题)(8)

猜您喜欢: