基本的Android面试问题小问题

一、序列化和反序列化

  1. 序列化 : 把数据按照一定的逻辑保存的过程
  2. 反序列化 : 把数据按照一定的逻辑恢复的过程
  • Serializable 性能不会太高 , 会记录类的全名、属性名 , 反序列化时是反射
  • Parcelable : write的顺序和read的顺序必须相同
    a. Java推荐(对成员进行序列化 , 内存间的序列化)
    b. write() -> Parcel(只记录属性值) -> read()

二、==和equal的区别

  1. ==比较的是内存地址
  2. equal比较的是值(比较的是值,String重写了hashcode方法)

三、ImageLoader、Picasso、Glide

  1. ImageLoader : 支持监听图片下载进度 , 可以在View滚动的时候暂停加载图片(PauseOnScrollListener)
  2. Picasso : 框架体积小、不支持GIF
  3. Gilded : Picasso的升级版 , GIF、Video、视频类优先

四、MVC和MVP模式

  1. MVC : 用户操作View发送请求 , Controller负责决定应该调用哪个Model来进行处理 , Model根据用户请求进行相应的业务逻辑处理并返回数据 , 最后Controller调用对应的View来显示Model数据
  2. MVP : View和Model不直接交互 , Presenter作为视图和数据的连接器 , 当View有变动或者Model有变动时 , 不会相互影响 , 耦合性低

五、ListView和RecyclerView的区别

  1. RecyclerView的ViewHolder编写规范是好的 , 自带item复用功能
  2. RecyclerView自带动画效果
  3. RecyclerView可以实现ListView、GirdView、瀑布流效果
  4. RecyclerView可以局部刷新(notifyItemChanged)

六、String、StringBuffer、StringBuilder

  1. String : 字符串常量 , 每次修改都会new一个新的对象
  2. StringBuffer : 可修改的字符串 , 线程安全
  3. StringBuilder : 可修改的字符串 , 线程不安全(单线程使用) , 效率比StringBuffer高

七、android动画

  1. 补间动画 : 不会改变View的真正位置和相关属性(点击事件的出发区域还是动画前的位置)
  2. 帧动画 : 加载一系列Drawable资源来创建动画
  3. 属性动画 : 改变View的属性值

八、设计模式

  1. 单例 : 确保类只有一个实例 , 且自行实例化并向整个系统提供这个实例
  2. Builder建造者模式 : 需要创建一个对象时要用到很多变量组合而成的时候
  3. 工厂模式 : 简单工厂模式、 工厂方法模式、抽象工厂模式(基类)
  4. 策略模式 : 一个类或算法可以在运行时更改

九、进程和线程的区别

  1. 进程是CPU资源分配的最小单位 , 线程是CPU调度的最小单位
  2. 进程之间不能共享资源 , 线程可以共享所在进程的地址空间和其他资源
  3. 一个进程可以有多个线程 , 进程可以开启进程 , 也可以开启线程
  4. 一个线程只能属于一个进程 , 线程可以直接使用进程的资源 , 线程依赖进程存在

十、内部类

可以直接访问外部类的属性
成员内部类、局部内部类、匿名内部类(没有构造方法)、静态内部类(static修饰 , 不能使用外围类的非static成员变量和方法)

十一、Synchronized

可以在多线程环境下座位线程安全的同步锁 , 可修饰 :

  • 代码块
  • 成员方法(方法用Synchronized修饰 , 修饰的是this)
  • 修饰静态方法(方法用Synchronized修饰 , 修饰的是Class对象)

十二、接口和抽象类的区别

  1. 接口用implements来实现 , 抽象类用extent继承
  2. 抽象类可以有构造函数 , 接口不能
  3. 抽象类可以有main方法能运行 , 接口不能
  4. 接口可以实现多个 , 抽象类只能继承一个
  5. 接口默认是public修饰 , 抽象类可以任意修饰符

十三、final的作用

  1. final修饰的变量叫常量 , 常量必须初始化 , 初始化后不能被修改
  2. final修饰方法 , 不能被重新
  3. final修饰类 , 最终类 , 不能被继承