最近面试好多东西都忘记了,脑子记不住东西,好记性不如烂笔头,所幸都记录在这里,以备忘记时参考。
1、Java中的值传递和引用传递的区别?
(1) 基本数据的传值,对形参的修改不会影响实参
(2) 引用类型传引用,形参和实参指向同一内存地址(即同一个对象),所以对参数的修改会影响到实际的对象
(3) String、Integer,Double等immutable的类型特殊处理,可以理解为传值,最后操作不会影响实参对象。
2、android 程序进入后台之后如何保证程序不会被回收?
一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源。Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低依次是:
1. 前台进程(Foreground Process)
2. 可视进程(Visible Process)
3. 服务进程(Service Process)
4. 后台进程(Background Process)
5. 空进程(Empty Process)
因此,要想让自己写的service不被系统kill掉,正常的做法是尽量提高程序的优先级,比如调用startforeground(true),因为service启动默认标记为background,当前运行的activity被标记为foreground的时候,当service设置为foreground,service与当前activity优先级类似,但是这样也不能保证它不会被系统给杀死,
解决办法:将自己写的service变成 core service ,即将自己的程序提升为系统级别的程序,这样在任何情况下都不会被kill掉,前提是应用程序需要设置两个标志:FLAG_PERSISTENT(persistent)和FLAG_SYSTEM
3、Hashmap遍历的四种方式
(1)普通遍历方法:通过map。keySet遍历key和value(普通使用二次取值)
(2)通过map.entrySet使用iterator遍历key和value
(3)通过map.entrySet遍历key和value(使用于大容量的数据)
(4)通过map.values()遍历所有的value,而不能遍历key
4、Hashmap和HashTable的区别
相同点:实现原理相同,功能相同,底层都是哈希结构表,查询速度快,很多情况下可以互用。
不同点:体现在线程安全性,同步(synchronization),以及速度三个方面。
1. Hashmap几乎等价于hashtable,hashmap是非同步(synchronization),并且可以接受null(hashmap可以接受null的key和value而hashtable不行)
2. Hashmap是非synchronized,而hashtable是synchronized,意味着线程较安全,如果没有正确的同步的话,多个线程是不能共享HashMap的
3. Hashmap的迭代器是(iterator)是fail-fast迭代器,而hashtable的迭代器是(enumerator)不是fail-fast迭代器
4. 由于hashtable是synchronized且线程是安全的,所以在单线程情况下它比hashmap要慢
5、网络请求中的安全问题
通过加密和签名
APP和服务器的安全隐患
1. 窃听对网络数据进行加密
2. 篡改给数据加签名,
3. 重放HTTPS可以防止重放攻击
4. 反编译前端加限制肯定不够,需要后端重新加密一次
加密机制的问题:可以使用AES对称加密
签名机制的问题,用的是MD5加秘钥
RSA秘钥生成算法:随机生成两个足够大的素数p和q,
6、Android中的性能优化(借鉴某大佬的理念)
性能优化主要可以从四个方面去了解
1、稳定性(内存溢出、崩溃) 2、流畅性(卡顿)
2、损耗性(耗电、流量) 4、安装包(apk瘦身)
(1)稳定性-----------内存优化
由于android应用的沙箱机制,每个应用分配的内存是有限制的,内存太低就会触发lmk-low memory killer ,也就会出现闪退。所以会造成crash和ANR,原因可能是资源问题,static关键字使用等,因此不要在主线程中进行耗时操作
(2)流畅--------------交互化
交互是与用户体验最直接的方面,交互场景大概分为四个部分,UI绘制,应用启动,界面跳转,事件响应
建议:布局优化:在android中系统对view进行测量布局绘制时,都是通过对view数组的遍历来进行操作的,布局复用,使用include标签复用layout,提高显示速度,减少层级,删除控件中无用属性
绘制优化:布局的优化,移除xml中非必须的背景,自定义view的优化
启动优化:优化闪屏页的UI布局,通过profile GPU rendering检测丢帧情况。启动加载逻辑优化,采用分布加载,异步加载的方式
刷新优化:减少刷新次数,缩小刷新区域
(3)节省------------耗电优化
Android5.0之后引用了获取设备上电量消耗的API Battery Historian,是系统电量分析工具,此外计算优化,避开浮点运算,避免walelock使用不当
(4)Apk瘦身
应用安装包的大小对应用使用没有影响,但apk包越大,用户使用门槛越高,特别是在移动网络数据下,下载应用的时候
常用方案:代码混淆、资源优化(删除冗余资源,资源文件最少化)、图片优化(利用AApt对PNG图片进行压缩处理)、避免重复功能的库、插件化(比如功能模块放在服务器上,按需下载,可以减少安装包的大小)
7、屏幕适配
最好通过权重的方式来分配每个组件的大小,
也可以通过像素(dip)进行适配,
合理使用wrap_contenthe 和math_parent
8、自定义控件
可以有三种实现方式:
(1)继承某个现有的组件,在此基础上重写改组件的方法;比如继承galle ry重写coverFlow()方法
(2)复合型组件定义:继承某个layout,实现复合组件自定义,如TextView和editText组合实现登录注册控件
(3)继承view,实现ondraw(),实现自己绘制的组件,如翻页效果
注:在继承viewGroup的时候会重写ondraw()
9、android机型适配优化
1. 合理使用wrap_content和math_parent
2. 尽可能使用RelativeLayout
3. 针对不同的机型使用不同的配置文件
4. 尽量使用.9图片
5. 使用与密度无关的像素单位(dp sp)
6. 对不同的设备提供可选择的图片
7. 识别当前布局文件是哪个?这个主要采用标志位的方式获取当前布局文件信息,针对当前布局没有的控件进行判断是否为null,
8. 根据当前布局,使用不同的响应操作
9. 在其他activity中复用fragments
下面有一些楼主的面试总结可以借鉴:Android2017-2018最新面试题(3-5年经验个人面试经历)
9、activity的启动模式
10、谈谈对事件分发的理解
11、service的用法有两种startService 和bindService使用
12、activity的生命周期和fragment的生命周期有何不同
13、简述rxJava的使用
14、Handler原理简单描述一下
15、scrollview和recycleview 滑动事件冲突怎么解决
16、glide用法在使用过程成遇到的问题
17、MVC和MVP和MVVM的区别
18、简单谈一下异步
19、内存优化(在使用项目的时候做过哪些)(20181015)
这是我面试过程中遇到的问题,答案有时间在续