Android面试题

1.

  1. ==equals的区别
  • ==比较的是在对象在栈里的地址是否相同,是绝对比较
  • equals是比较对象的属性,通过实现继承自Objectequals()hashCode()

2. GC是什么

  • GC是垃圾回收,GC是Java的垃圾自动回收机制,JVM在内存吃紧时,会回收无用变量占用的内存

3. Java包装类的意义

  1. 方便基本类型的转换(基本类型不是都能自动转换。比如Stringint
  2. 便于函数传值
  3. 在需要Object类的地方,方便转换基本类型(如需要hashCode作为依据的Map

4. Integer与int的区别

  • 默认初始化赋值,Integernullint为0
  • Integerint比较时,会自动拆箱为int

5. LinkedList和ArrayList

  1. LinkedList基于双向链表实现,适用插入和删除操作
  2. ArrayList基于数组实现,默认初始容量为10,适用随机访问(查找)

6. ListView如何提高效率

  1. 分页加载数据
  2. 复用convertView
  3. 快速滑动时,不显示图片UI

7. 两个Activity跳转的生命周期

  1. Activity A执行onPause()
  2. Activity B执行onCreate() onStart() onResume() 之后,A执行onStop()

8. px dp sp

  1. px 屏幕像素
  2. dp 屏幕独立像素
  3. sp scale independent pixel

9. Android数据存储

  1. SharedPerfrences
  2. FileInputStream FileOutputStream
  3. SQLite
  4. ContentProvide

10. SQLite事务

  1. 为了让数据库操作是原子操作
  2. 实现事务,进行数据库操作时
    1. 调用BeginTransaction

11. 浏览器访问www.baidu.com的全过程

  1. DNS服务器解析域名地址获取到ip
  2. 浏览器与ip地址的服务器建立TCP连接(3次握手)
  3. 浏览器发送HTTP请求
  4. 服务器收到HTTP请求,返回HTTP响应
  5. 浏览器接受HTTP响应文件
  6. 释放TCP连接(4次挥手)
  7. 浏览器解析下载的文件解析成HTML显示到网页
  8. 涉及的协议
    1. 传输层 TCP
    2. 应用层 HTTP(使用TCP) DNS(使用UDP)
    3. 网络层 IP ICMP(差错检测) ARP(路由选择)

12. 如何结束线程

  1. 使用标志来结束循环
  2. 调用interrupt()强行打断,线程需要释放

13. Sleep和Wait作用和区别

  1. Sleep属于Thread类 Wait属于Object类
  2. Sleep()调用过程中,线程不会让出cpu,占用cpu处于休眠状态,线程处于暂停状态,不会释放对象锁。当Sleep()结束之后,线程继续执行。
  3. Sleep释放对象锁,wait不释放对象锁。
  4. Sleep必须捕获异常,wait() notify()可以不捕获异常

14. Andriod消息机制 Message MessageQueue Handler Looper

  1. 每个线程通过ThreadLocal储存自己的Looper
  2. Handler在创建时会通过当前线程获取当前线程的Looper
  3. 通过Handler可向Handler中储存的Looper中的Message Queue发送消息
  4. Looper中循环获取Messsage Queue中的消息交给发送该Message的Handler

  5. 总结

    1. 每个Thread只对应一个Looper
    2. 每个Looper只对应一个MessageQueue
    3. 每个MessageQueue有N个Message
    4. 每个Message最多可指定一个Handler来处理

15. 什么是ANR,如何避免

  1. ANR:应用程序无响应
  2. 出现情况:前提是要有输入事件(按钮按下,屏幕触摸等)
    1. 在5秒内没有响应输入事件
    2. BroadcastReceiver在10秒内没有执行完
    3. Service在特定时间内(20秒内)没有处理完
  3. 避免ANR
    1. 避免在主线程上进行复杂的耗时操作。耗时操作采用多线程执行
    2. 在BroadcastReceiver中需要进行复杂操作时,可以在onReceive()中创建行Service来执行
    3. 在编码设计时,避免出现同步/死锁的情况

16. String.valueof()的作用和意义

  1. 返回传入的对象的String描述,如果传入的对象为null则返回内容为null的字符串
  2. 相比Object的toString对象,该方法可以避免NullPointerException发生

17. StrognRefrernce、SoftReference、WeakReference和PhantomRefrence

  1. 引用级别
    • 强引用>软引用>弱引用>虚引用
  2. 强引用
    • 是使用最普遍的引用。如果一个对象具有强引用,GC不会回收,在内存不足时,JVM抛出OutOfMemoryError,使程序终止也不会通过回收强引用来解决内存不足。
  3. 软引用
    • 当一个对象是软引用时。在内存充足时,GC不会回收;当内存不足时,GC就会回收软引用对象。
  4. 弱引用
    • 弱引用比软引用的生命更弱,GC在执行回收时,发现弱引用对象已经没有强引用或软引用时就会回收该弱引用对象
  5. 虚引用

18. Activity启动模式

模式 名次 配置 说明
standard 默认模式 不用单独写配置 每次都会创建一个新的Activity实例
signleTop 栈顶优先 launchMode="signleTop" 当Activity在栈顶时,启动相同的Acttivity,不会创建新的实例;不在栈顶时,创建新的实例。onNewIntent()
signleTask 栈内优先 launchMode="signleTask" 当Activity在应用栈内时,不会再重复创建Activity,直接移到前台。onNewIntent()
signleInstance 单例存在 launchMode="signleInstance" Activity会以单独的进程启动,与其他Activity处于不同的栈

19.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?

  • 静态内部类:使用static修饰的内部类
  • 内部类:在某个类的内部又定义一个类,内部类所嵌入的类称为外部类
  • 匿名内部类:使用new生成的内部类 (比如按钮的点击监听事件new OnClickListener)
  • 内部类持有的引用是外部类类名.this,因为内部类的产生依赖于外部类。

20.ArrayList和Vector的主要区别:

  • Vector是线程同步的数组,当容量不足时,容量会翻倍增加
  • ArratyList是线程不同步的数组,当容量不足时,容量按50%增加
  • Java集合,HashMap []()

21.switch支持使用整形byte,short,int,char,不支持long,布尔。String在Java 7允许。