Android面试中常遇到的问题(一)

转眼间在深圳已经待啦三年,几多欢喜几多愁,当中也换过几次工作,但每次基本都是老本行android开发。在每次面试中总不免会遇到面试官常问到的一些问题,之前总是在网络上搜索,临时抱佛脚,现在自己也对之前的问题总一个系统的记录,自己也加强下记忆,希望能够对正在找工作的伙计们带来一点点帮助。

1、java中存在哪几种引用,他们的含义和区别是什么?不同引用的使用场景?

1)、java中的引用可以分为四种即强引用、软引用、弱引用、虚引用。java中提供这四种引用类型的目的为首先是可以让开发者通过代码的形式自己决定对象的生命周期。其次有效利用JVM垃圾回收机制进行垃圾回收。

2)、不同的引用的不同含义如下:

强引用即创建一个对象并把这个对象赋值给一个引用变量。例如:Student student=new Student(); String name="秦琼";

请引用在有引用变量时永远不会被回收,即便Jvm出现OutOfMemory错误也不会回收这种这种对象。如果想中断强引用和某个对象之间的关联,则可以直接显示的将引用赋值为null,那么JVM会在他认为合适的时间去回收这个对象。

软引用即具有软引用的对象,在内存空间足够时不会被JVM回收,但是如果遇到内存空间不足时JVM便会回收软引用对象所占的内存空间。他的特点是他的一个实例保存对Java对象的软引用,他的存在不会妨碍Java垃圾回收线程对该java对象的回收。即一旦软引用保存啦对一个java对象的软引用。在垃圾线程对该对象回收之前软引用类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。

软引用可以实现内存敏感的高速缓存,例如图片缓存、网页缓存等,使用软应用可以增强程序代码的健壮性防止内存泄漏。

弱引用即也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存空间是否充足,都会回收弱引用对象所占用的内存空间。在Java中使用WeakReference类来表示

运行结果如下:Android面试中常遇到的问题(一)_第1张图片

如果是先使用强引用,在将强引用和弱引用联系起来则会出下如下结果:

Android面试中常遇到的问题(一)_第2张图片以上两个例子说明一个事实,例子一第二个结果输出是null,说明JVM只要进行垃圾回收,被弱引用关联的对象必定会被回收掉,不过此处所说的被弱引用关联的对象是指仅有弱引用与之关联。例子二说明,当如果一个对象存在强引用同时与之关联,则进行垃圾回收时,便不会会该对象(软引用也是如此)。例子二已经说明啦结果。但是弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

虚引用,虚引用和软引用、弱引用不同。她并不影响对象的生命周期。在java中使用PhantomReference类表示。如果一个对象和虚引用相关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

  要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

3)、对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。get方法用来获取与软引用关联的对象的引用,如果该对象被回收了,则返回null。

   在使用软引用和弱引用的时候,我们可以显示地通过System.gc()来通知JVM进行垃圾回收,但是要注意的是,虽然发出了通知,JVM不一定会立刻执行,也就是说这句是无法确保此时JVM一定会进行垃圾回收的。

2、请使用Java实现一个线程安全且高效的单例模式?

什么是单例?一个类有且仅有一个实例,并且自行实例化向整个系统提供。

使用单例的目的:

       1、减少内存的占用
       2、单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
       3、因为类控制了实例化过程,所以类可以灵活更改实例化过程 

不同的单例模式:

public class SingleDemo {
    /**
     * 单例模式有多种懒汉模式
     */
    private SingleDemo() {
    }

    private static SingleDemo instance = null;

    public static SingleDemo getInstance() {
        if (instance == null) {
            instance = new SingleDemo();
        }
        return instance;
    }

    /**
     * 饥饿模式的单例
     */
    private static final SingleDemo instance1 = new SingleDemo();

    public static SingleDemo getInstance2() {
        return instance1;
    }

    /**
     * 双重锁模式 静态方法同步的时候,使用的锁,就不能是this,而是类.class
     */
    private static SingleDemo instance3;

    public static SingleDemo getInstance3() {
        synchronized (SingleDemo.class) {
            if (instance3 == null) {
                instance3 = new SingleDemo();
            }
        }
        return instance3;
    }

    /**
     * 修改过的双重锁模式
     */
    private static SingleDemo instance4;

    public static SingleDemo getInstance4() {
        if (instance4 == null) {
            synchronized (SingleDemo.class) {
                if (instance4 == null) {
                    instance4 = new SingleDemo();
                }
            }
        }
        return instance4;

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}













你可能感兴趣的:(java(基础))