当前位置: 移动技术网 > IT编程>开发语言>Java > 2020-Android-面试总结(1)

2020-Android-面试总结(1)

2020年07月17日  | 移动技术网IT编程  | 我要评论

目录

Java部分

1. 数组与链表

2. 设计模式

1. 单例模式

2. 建造者模式(Builder)

3. 适配器模式

4. 装饰模式

5. 策略模式

6. 观察者模式

7. 状态模式

8. 工厂(方法)模式

3. sleep、wait、join区别

4. synchronized的使用

类锁

  • 静态方法
 public static synchronized void doWork(){
    }
  • 锁对象为class对象
class Sync {
    public static  void doWork(){
        synchronized (Sync.class){
        }
    }
}

对象锁

  • 同步代码块
    public void doWork(){
        synchronized (this){
            //TODO ....
        }
    }
  • 方法锁
  public synchronized void doWork(){
    }

5. 造成死锁的原因?

  1. 系统资源的竞争
    系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁
  2. 进程运行推荐顺序不合适

四个必要条件

互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程来释放(只能是主动释放)

循环等待条件:若干进程间形成首尾相接循环等待资源的关系

凡是满足上述四个条件就会发生死锁。

7. Java反射、注解、注解处理器

8. TCP/IP协议

9. 谈谈java内存模型

概述:

Java内存模型定义了线程和主存直接的抽象关系:线程之间的共享变量存储在主存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程共享变量的副本,其实本地内存是java内存模型抽象概念并不是真实存在,涵盖了缓存、写缓冲区、寄存器等区域,Java内存模型控制线程间的通讯,他决定一个线程对主存变量的写入何时对另一个线程可见。
在这里插入图片描述

线程A和线程B之间通讯需经历一下步骤:
1. 线程A把线程A本地内存中更新过的共享变量刷新到主内存中去
2. 线程B到主内存中读取线程A之前更新过的共享变量

原子性、可见性、有序性

  • 原子性:对基本数据类型的读取和赋值是原子性操作,即这些操作是不可被中断的,要么执行完毕要么不执行
x=3 :原子性操作
y=x :非原子性,其包含了两个操作,一个是读取x值,一个是写入到工作内存中,这两个操作分别是原子性
x++ :非原子性,包含了三个操作,读取x的值,对x进行加1,写到主内存中
总结:一个语句包含多个操作时就不具备原子性
  • 可见性
    可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的,也就是一个线程修改的结果另外一个线程立马可见。当一个共享变量被volatile修饰时,他会保证修改的值被立即更新到主内存。当有其他线程读取改值时,其他线程会在主内存中读取新值。普通共享变量不能保证可见性,因为普通共享变量被修改后,并不会立即被写入主内存中,是不确定性的,此时主内存中可能还是以前的值,因此普通共享变量无法保证可见性。
  • 有序性
    Java内存模型中允许编译器和处理器对指令进行重排序,虽然重排序过程不会影响到单线程的正确性,但是会影响到多线程并发执行的正确性,这时可以同volatile来处理,还可以使用synchronized和Locked保证有序性(同步)。

10. 线程池

12. volatile关键字

volatile不能保证原子性,比如自增就无法保证,当一个共享变量被volatile修饰时,他会保证修改的值被立即更新到主内存。当有其他线程读取改值时,其他线程会在主内存中读取新值.

volatile使用条件

  • 对变量的写操作不会依赖当前值(不能自增、自减等操作)
  • 改变量没有包含在具有变量的不变式中

场景:状态标志、双重检查DCL单例

13. HashMap了解多少?

Android部分

1. Activity屏幕旋转经历的生命周期?

2. 讲讲Activity的启动模式

3. 服务里面如何启动Activity?为什么要这么做?

4. 如何避免以及定位内存泄漏

5. 什么是ANR?

6. 什么是OOM?

7. 如何对Bitmap图片进行优化?

8. 讲一讲Android的消息机制

9. 讲一讲View的事件分发机制

10. 自定义View的流程

11. 自定义ViewGroup的流程

12. 开发过程中做过哪些性能方面的优化?

13. 阅读过哪些源码(Rxjava、Okhttp、Retrofit、Glide等等)?简单介绍下

本文地址:https://blog.csdn.net/wu996489865/article/details/107324397

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网