首页 /  技术专区  /  面试题 宽屏模式 >

面试题基础二(JAVA基础部分)

1.    线程的状态都有哪些?创建一个线程的常用方法有哪些?

第一是创建(New)状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。 

第二是就绪(Runnable)状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 

第三是运行(Running)状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。 

第四是阻塞(Blocked)状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspendwait等方法都可以导致线程阻塞。 

第五是死亡(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;
    }
}


头像
0/200
图片验证码