面试题(一)——金山

758 阅读2分钟

金山

1.Bitmap 大图加载?

考察点 :BitmapFactory.Options

使用BitmapFactory.Options获取图片大小,根据ImageView大小计算缩放比例。

1.BitmapFactory.Options 获取图片大小
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.qb, options);

根据ImageView大小计算缩放比例inSampleSize
选择占内存小的颜色模式,设置option.inPreferredConfig

2.leakCanary

内存溢出有几种情况

1.handle挟持Activity

2.bitmap图片没有释放回收

3.广播未取消注册

leakCanary 工作原理
	
 重点:软引用

原理:

在一个Activity执行完onDestroy()之后,将它放入WeakReference中,然后将这个WeakReference类型的Activity对象与ReferenceQueque关联。这时再从ReferenceQueque中查看是否有没有该对象,如果没有,执行gc,再次查看,还是没有的话则判断发生内存泄露了

3.SDK设计模式

策略模式+工厂模式+反射

4.Router 路由器

组件化开发,少嵌入,可以多人开发。

5.密钥如何保存

1.keystore
2.生物认证保护
3.AES256加密保护

6.为什么选择ReactNative 不选择Flutter

7.ArrayList 如何一次遍历删掉指定字符串

倒序遍历remove掉指定字符,

因为用for顺序遍历remove的话会删除不了相同的字符如ArrayList里有两个bb字符,

用foreach则会报并发修改异常java.util.ConcurrentModificationException

因为在顺序遍历的时候,匹配到删除字符后,ArrayList源码里面会执行System.arraycopy方法,把

后一个元素移动至当前位置,导致下一次循环遍历时后一个字符串bb并没有遍历到,所以无法删除。

8.两个Thread 如何按顺序进行顺序执行

使用Thread.join Thread.await Thread.notify

1.join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。
应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。

2.

[1] 使用线程的join方法

[2] 使用主线程的join方法

[3] 使用线程的wait方法

[4] 使用线程的线程池方法

[5] 使用线程的Condition(条件变量)方法

[6] 使用线程的CountDownLatch(倒计数)方法

[7] 使用线程的CyclicBarrier(回环栅栏)方法

[8] 使用线程的Semaphore(信号量)方法

www.cnblogs.com/myseries/p/…

二面

1、gradle

2、Binder多进程通讯

3、性能优化

1.内存优化

2.代码优化

3.opencv优化二维码

4、一个app有多少个context

总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)

5、application 与activity 有什么区别

生命周期不同

6、一个activity有多少个window

phoneWindow