Android面试笔试题记录

267 阅读5分钟

ArrayList、LinkedList、HashMap、HashTable的不同点

  1. ArrayListLinkedList

    • 数据结构:ArrayList 基于动态数组实现,LinkedList 基于双向链表实现。
    • 随机访问效率:ArrayList 支持高效的随机访问,通过索引获取元素速度快。LinkedList 随机访问效率低,需要从头或尾遍历链表来获取指定位置的元素。
    • 插入和删除操作:在中间位置进行插入和删除操作,ArrayList 效率较低,因为可能涉及元素的移动。LinkedList 在中间插入和删除效率高,只需修改指针。
  2. HashMapHashTable

    • 线程安全性:HashTable 是线程安全的,方法都被 synchronized 修饰。HashMap 是非线程安全的。
    • 空值处理:HashMap 允许键和值为 nullHashTable 不允许键和值为 null
    • 性能:由于 HashTable 的线程同步,在单线程环境下,HashMap 的性能通常优于 HashTable

总的来说,在选择使用时,需要根据具体的需求和使用场景来决定。如果需要线程安全,使用 HashTable ;如果不需要线程安全,通常使用 HashMap 。对于列表,如果需要高效随机访问,选择 ArrayList ;如果频繁进行插入和删除操作,尤其是在中间位置,选择 LinkedList

讲一讲StackOverFlow和OOM的区别?栈和堆分别存储的是什么?

StackOverflow(栈溢出)和 OutOfMemory(内存溢出,简称 OOM)是两种不同的内存相关问题。

StackOverflow 通常是由于方法调用层次过深,导致栈空间被耗尽。栈用于存储方法调用的上下文信息,包括局部变量、方法参数、返回地址等。当递归调用没有正确的终止条件,或者方法调用链太长,就可能导致栈空间不足,从而引发 StackOverflow 错误。

OOM 则是指程序在运行过程中申请的内存超过了系统能够提供的最大内存,导致无法分配足够的内存。堆用于存储对象实例和数组等动态分配的内存。如果不断创建对象而不及时释放,或者加载过大的数据到内存中,可能会导致堆内存不足,引发 OOM 错误。

总之,StackOverflow 是栈空间不足的问题,而 OOM 是堆内存不足的问题。

Android中onTouch,onTouchEvent,onClick优先级

在 Android 中,onTouch、onTouchEvent和onClick的优先级从高到低依次是:onTouch、onTouchEvent、onClick。 onTouch方法会在触摸事件发生时首先被调用,如果在onTouch方法中返回true,表示该事件已经被处理完毕,不会再传递给onTouchEvent方法。 onTouchEvent在onTouch未处理或处理后返回false时被调用。 onClick是在触摸操作满足点击条件时触发,前提是前面的触摸处理没有消耗掉该事件。

FragmentPagerAdapter和FragmentStatePagerAdapter的区别

  1. 内存管理:

    • FragmentPagerAdapter 会一直保留所有加载过的 Fragment 实例,无论它们是否可见,这可能导致内存消耗较大,特别是当页面数量较多时。
    • FragmentStatePagerAdapter 对于不可见的 Fragment ,会销毁其视图,只保留 Fragment 的状态信息,从而在一定程度上节省内存。
  2. 适用场景:

    • 如果页面数量较少,且希望在切换页面时保持 Fragment 的状态(例如已输入的文本等),适合使用 FragmentPagerAdapter
    • 如果页面数量较多或者对内存使用较为敏感,应使用 FragmentStatePagerAdapter
  3. 恢复方式:

    • FragmentPagerAdapter 直接使用已存在的 Fragment 实例。
    • FragmentStatePagerAdapter 在需要恢复不可见的 Fragment 时,会重新创建新的 Fragment 实例,并根据之前保存的状态信息恢复其状态。

Java垃圾回收机制原理和内存泄漏的例子

  • 原理: Java 中的垃圾回收器会周期性地检查堆内存中的对象,判断哪些对象不再被引用,即没有任何变量指向它们。一旦确定对象不再被使用,就会将其回收,释放其所占用的内存空间。
  • 常见的内存泄漏例子
    • 未正确关闭资源,比如数据库连接、文件输入输出流等。如果使用完毕后没有调用相应的关闭方法,会导致资源一直被占用,无法被回收。
    • 内部类持有外部类的引用。如果内部类的生命周期长于外部类,可能会导致外部类无法被及时回收。
    • 集合类中的对象未被移除。例如,如果向一个集合中添加对象,然后不再使用这些对象时却没有将它们从集合中移除,集合会一直持有这些对象的引用,导致内存泄漏。
    • 在 Android 开发中,由于其特殊的环境和资源限制,更需要特别注意避免内存泄漏。

安卓启动模式及使用时注意事项

Android 中有四种启动模式:standard(默认模式)、singleTop、singleTask 和 singleInstance 。

  1. standard 模式:每次启动都会创建新的实例,这可能会导致同一个 Activity 存在多个实例。

    • 注意事项:如果频繁创建新实例可能消耗较多资源,要注意控制 Activity 的创建频率。
  2. singleTop 模式:如果 Activity 已经在栈顶,就不会创建新的实例,而是调用其 onNewIntent 方法。如果不在栈顶,还是会创建新的实例。

    • 注意事项:在处理 onNewIntent 时,要正确更新界面数据。
  3. singleTask 模式:在一个任务栈中只会存在一个实例。如果要启动的 Activity 已经存在于栈中,会将其上面的 Activity 出栈,使其位于栈顶。

    • 注意事项:可能会影响到栈中 Activity 的生命周期,需要处理好 Activity 之间的交互和数据传递。
  4. singleInstance 模式:单独存在于一个任务栈中,并且整个系统中只有一个实例。

    • 注意事项:与其他 Activity 交互时需要特别处理,因为它们处于不同的任务栈。

在使用启动模式时,需要根据具体的业务需求合理选择,同时要充分考虑到不同启动模式对 Activity 生命周期、任务栈管理以及应用性能和用户体验的影响。