天天看点

Android面试题记录

JAva面试题
  1. String ,StringBuffer,StringBuilder的区别?

    (1) String字符串常量,StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全)

    (2) String类型和StringBuffer类型的主要性能区别就是String是不可改变的对象,在每次对String

    类型进行改变的时候其实都等同于生成一个新的String对象,然后将指针指向新的String对象,会对系统性能产生影响,当内存中无引用对象多了以后,JVM的GC就会开始工作,速度会相当慢; 使用StringBuffer类,每次结果都会对StringBuffer对象本身进行操作,而不是重新生成对象,再改变对象引用。

    StringBuffer是可变的,在缓冲区中追加字符串或者插入指定位置字符串,而且线程安全,比String大多数情况要快,而StringBuilder就是StringBuffer的一个替身而已,就是快,而且线程不安全。

    1. 抽象类与接口在语法和使用上有哪些区别?

    (1) 抽象类(abstract class);定义:如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就叫作抽象类。

    抽象方法:只声明,不实现。具体的实现需要继承它的子类来实现,抽象类是为了继承而存在的,抽象类不能用来创建对象。也就是说被 abstract修饰的方法 一般抽象方法为public 或者protected 例 如: public acstract String A();

    (2) 接口 (interface) 定义: 接口抽象方法的集合,通过继承接口的方式来继承接口中的抽象方法例如:interface A(){} ; 接口只能用public static final 修饰;接口中没有构造方式(接口不是类);接口中的方法必须是抽象的;接口支持多继承(例如:class A implements B,C,…)

    (3抽象类和接口的区别)

    1.抽象类可以提供成员方法的实现,而接口只能存在public abstract方法

    2.抽象类中的成员变量可以是各种类型,接口中的成员变量只能是public static final类

    3.抽象类可以有静态代码块和静态方法,接口中不能含有静态代码块以及静态方法

    4.一个类只能集成一个抽象类,而一个类可以实现多个接口

    1. java中 == 和equals和hashCode的区别?

    “==”用来比较两个变量(基本类型和对象类型)的值是否相等,如果是基本类型的比较直接比较值;如果是对象类型比较那么它比较的是两个对象在栈中的引用(地址)

    “equals” 通过判断两个对象的地址是否相等

    “hashCode”它的作用是获取哈希码,这个哈希码的作用是确定该对象在哈希表中索引位置;是返回对象在类存中地址转换成的一个int值,如果没有重写hashCode方法,任何对象的hashCode都不相等

    https://juejin.im/post/584ac23061ff4b0058d5250f
    4.ArrayMap,HashMap,ArrayList,LinkedList的数据结构是什么样的?
    1. ArrayMap是通过Key– value 映射数据结构的,ArrayMap保持它的映射到一个数组结构,一个Integer数组来储存每一个item的哈希码,一个对象数组来储存键值对,这样避免了为每一个条目都创建一个额外对象,更有效的控制了数组大小,因为它通过二分查找的方式,所以比hashMap慢。
    2. HashMAp 的底层是基于数组和链表来实现的,查询速度快是因为通过计算哈希码来决定储存位置,HashMap主要通过key的HashCode来计算hash值的;HashMap底层通过链表来解决hash冲突。
    3. ArrayList 数组集合;ArrayList允许为空;允许重复数据;有序;非线程安全
    4. LinkedList 基于双向循环链表实现,随机增删较快,存取时需要遍历查询;非线程安全,适合在单线程下使用;LinkedList实现了Serializable接口,支持序列化。

      ArrayMap 替换 HashMap

      ArraySet 替换 HashSet

      SparseArray 替换 HashMap

      SparseBooleanArray 替换 HashMap

      SparseIntArray 替换 HashMap

      SparseLongArray 替换 HashMap

      LongSparseArray 替换 HashMap

4.wait() 和 sleep() 的区别?

wait()用于线程间的通信,wait()只能在同步(synchronize)环境中被调用;进入wait状态的线程能被notify和notifyAll线程唤醒;wait通过有条件的执行,线程会一直处于wait状态;进入wait状态时会释放对象的锁。

sleep()用于短时间暂停当前线程;sleep让线程进入休眠状态;进入sleeping状态的线程不能被notify唤醒;

Android

1.Activity生命周期?

a. 启动Activity: onCreate() -> onStart() -> onResume()

b. Activity退居后台: 当前Activity跳转到新的Activity界面或者按Home键返回主屏:

onPause() -> onStop()

c. Activity返回前台: onRestart() -> onStart() -> onResume()

d. 锁屏: onPause() -> onStop()

e. 解锁: onStart() -> onResume()

Activity退居后台,且内存不足,系统会杀死这个后台状态的Activity(此时这个activity还在任务栈中,只是引用的对象已经为null),若再次回到这个Activity时会从新走一次启动Activity的生命周期

2.Fragment生命周期?

3.Activity启动模式介绍?

Activity的启动模式有四种: standard,singleTop,singleTask,singleInstance

AndroidManifest.xml清单文件 android:launchMode属性来指定启动模式

4.service的启动方式以及区别?怎么停止一个service?

a.在Context中通过 public boolen bindService(Intent service,ServiceConnection conn,int flags)方法进行Service与Context关联并启动;Service的生命周期依附于Context

b.通过public ComponentName startService(Intent service)方法启动一个Service,此时Service生命周期与Context无关。

需要注意的是都需要在清单文件 xml中注册Service例如

上一篇: java面试记录