-
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不用