1. 线程的状态都有哪些?创建一个线程的常用方法有哪些?
第一是创建(New)状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪(Runnable)状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行(Running)状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞(Blocked)状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡(Terminated)状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
一、继承Thread类创建线程子类
1.在这子类中重写run方法,在run方法内写线程任务代码
2.创建该子类实例,即是创建了一个线程实例
3.调用该实例的start方法来启动该线程
二、建一个类去实现Runnable接口
1.该类去实现接口的run方法,run方法内写线程任务代码
2.创建该类实例,把该实例当作一个标记target传给Thread类,如:Thread t = new Thread(该类实例);即创建一个线程对象
3.调用线程的star方法来启用该线程
2. 值传递和引用传递的区别和联系
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。
3. 阐述你对构造函数以及常量的理解?
构造函数是类在实例化成对象时用来做一些事情的,而这些事情是该对象被创建时必须做的事。例如初始化属性,但不限于此。另外我们可以对构造函数进行重载,是让我们在类的实例化时能够更多元化。
简单地说,用final修饰过的变量就叫常量,常量一旦定义了就不允许被修改。往大的说,定义常量,是不想让某些固定的属性或方法被调用后改变了值,或者被继承后重写。往底层说,常量存放在常量池里,在类加载之前就已经被加载,且不会改变。
4. List、Map、Set三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。即,有序可重复。
访问时可以使用for循环,foreach循环,iterator迭代器 迭代。
Set 无法拥有重复元素,内部排序。即,无序不可重复。
访问时可以使用foreach循环,iterator迭代器 迭代。
Map 保存 key-value 值,一一映射。key值 是无序,不重复的。value值可重复。
访问时可以map中key值转为为set存储,然后迭代这个set,用map.get(key)获取value。
5. 请写出string stringbuffer stringbuilder的区别
1)可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
2)是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
6. 写出一个单例类(Singleton)
1.饥汉式单例
public class Singleton {
private Singleton(){};
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
2.懒汉式单例
public class Singleton {
private Singleton(){}
private static Singleton instance = null;
public static synchronized Singleton getInstance(){
return instance==null?new Singleton():instance;
}
}