android 九月九日面试题记录

  • 1.内存泄漏和内存溢出的区别

        内存溢出是指程序在申请内存时,没有足够的内存使用,系统已经没有办法分配出更多的内存来供给程序使用

        内存泄漏指的是应用程序在申请内存时,无法释放已经申请的内存,少次的内存泄漏可以忽略不计,但是多次的内存泄漏容易造成内存溢出

  • 2.线程的几种创建方式

        2~1.继承thread,重写run方法,在run方法里面做耗时操作

示例代码:

public class MyThread extends Thread{//继承Thread类

  public void run(){
  //重写run方法

  }

}

public class Main {
  public static void main(String[] args){
    new MyThread().start();//创建并启动线程

  }

}

        2~2.实现runnable接口来实现

示例代码:

public class MyThread implements Runnable {//实现Runnable接口

  public void run(){
  //重写run方法

  }

}

public class Main {
  public static void main(String[] args){
    //创建并启动线程

    MyThread myThread=new MyThread();

    Thread thread=new Thread(myThread);

    thread().start();

    //或者    new Thread(new MyThread()).start();

  }

}

        2~3.使用匿名内部类来创建

示例代码:

 new Thread(new Runnable{  
      
    @Override  
    public void run(){  
          
             
    }  
}).start();
  • 3.进程与线程的区别

        1.进程是当前执行的一段程序,而线程则为进程中的一个任务

        2.一个线程只能属于一个进程,但是一个进程可以包含多个线程

        3.线程没有地址空间,包含在了进程里面

        4.线程的开销比进程要小

  • 4.arraylist和linkedlist的区别(大致区别)

        1.arraylist是array的动态数组的数据结构,而linkedlist是由链表形式存储数据的

        2.在进行get和set数据时,arraylist的效率是比linkedlist要快的,因为linkedlist是由链表进行存储的,需要进行查找的数据要按照指针依次从前往后进行查找,

        对于remove和add操作时,linkedlist的效率要更高一点,因为对于arraylist来说,进行add和remove操作时会对数据的下标造成影响,需要进行动态的移动

  • 5.service的两种启动方式和生命周期

  •        1.startService

                要在使用startService的类里面在onDestroy方法里面进行stopService主要用来执行后台计算操作

                1.1.生命周期为,onCreate(只会被调用一次),onStartCommand(可以被多次调用,但是会多次执行这个方法),onDestroy(在销毁的时候会调用一次)

                1.2.如果当前的service已经启动过了,再次调用startService的话,不会再重新创建新的service,直接复用这个service ,可以理解为只允许存在一个实例。启动service的组件被销毁后,service是不会被销毁的,还是会继续运行的。service不是运行在单独的进程当中的,是依赖于当前的应用程序,如果当前的应用程序被销毁后,service也会随之销毁。无论启动了多少次的service,只需使用一次stopService即可

  •         2.bindService,

                要在bindService的类里面在onDestroy里面进行unbindService操作,主要用于和其他组件交互比较多

                2.1.生命周期为,onCreate,onBind,OnUnBind,onDestroy

                2.2.调用bindService之后会调用onCreate和onBind方法,然后调用者就可以通过

IBinder和service进行交互了,如果再次调用bindService,不会再重新创建新的service了,也不会在调用onBind方法,只需要把IBinder传递给其他的后来的客户端即可,绑定模式下,service和调用者共存亡

  • 6.事件分发机制

  • 7.activity的启动模式和生命周期

启动模式   

  1  starandard 默认的启动模式

每次启动activity都会存放到activity的任务栈里面进行堆叠 如下图

2.singleTop 栈顶复用模式

如果当前的activity 处于栈顶则复用 如果不在栈顶则重新创建

 3.singleTask栈内复用模式

如果启动的activity不在栈顶则清除当前的activity的上层activity,使之置为栈顶 应用场景多为主页

 4.singleInstance

设置为singleInstance模式的activity每次启动都会重新创建任务栈来存放单独的activity,如果存在了当前需要创建的activity的实例,则不会重新创建,而是重新唤醒

 5  生命周期

oncreate onstart onremuse onpause onstop ondestroy onrestart

 6 fragment生命周期 

onAttach oncreate oncreateView onActivityCreate onStart onRemuse onPause  onStop onDestroyView onDestroy onDetach

8.Stringbuffer和StringBuilder的区别

        StringBuilder是线程不安全的,StringBuffer是线程安全的 StringBuffer里面有很多同步锁,所以保证线程是安全的,但是StringBuilder并没有此关键字,所以不能保证线程安全,如果要使用多线程操作的话使用StringBuffer是安全的,单线程的话使用StringBuilder就可以了  

9. == 与equse的区别 

        ==是运算符,表示引用是否相等 比较两个对象的引用,equse是判字符串是否相等,比较两个对象的地址 equse调用的是Oject里面的方法

10.广播的几种注册方式

        10.1 动态注册

                但是要注意在调用者的onDestroy时候使用反注册 防止内存泄漏

                优点:试用完成后进行反注册,不占用资源,并且优先级高于静态注册

                缺点:程序退出后就无法接收到广播,无法进行广播监听

        10.2 静态注册

                 清单文件中进行注册,缺点:常驻会耗费cpu和耗电,优点:不受生命周期的影响,常驻。使用场景:监听开机自启的广播

  • 11.recyclerViewe和listView的区别

1.缓存机制不同

2.局部刷新功能

3.点击事件不同

4.复用viewHolder

5.设置布局管理器进行控制横向,纵向,瀑布流的样式

6.item动画

  • 12.handler机制  

handler 线程间的通讯 

主要分为四大对象,Handler,Message,MessageQueue,looper

handler 消息处理者,负责把massage发送到messageQueue中

Message 消息,存放耗时操作或者是子线程执行的结果

MessageQueue 消息队列,存放Message的队列 

Looper 轮训器 对MessageQueue进行轮询,如果有消息就取出来进行处理

  • 13.多线程的了解

  • 14.java的基本数据类型

byte short int long 

float double boolean String

  • 15.常用的设置模式

单例模式,builder模式,策略者模式,适配器模式,观察者模式,工厂模式

  • 16.单例模式

确保只存在一个实例,不需要重复的创建对象,对于消耗内存的类,使用单例模式可以很好 的减少资源的浪费

私有的变量 公共的构造方法,私有的静态函数来获取该单例

常见的单例模式

public class Singleton {
    private static volatile Singleton instance = null;

    private Singleton(){
    }
 
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

  • 17.sleep和with的区别

sleep来自于Thread类,with来自于Object类

1.sleep没有释放锁,而with释放了锁是其他线程可以控制某些方法

2.sleep不让出系统空间,with是进入线程池进行等待,其他的线程可以占有cpu

3.with只能在同步的方法里面使用,而sleep可以在任何地点使用

4.sleep必须需要捕获异常,而with不用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值