您的位置:首页 > 职场人生

java面试准备2

2014-07-21 09:43 225 查看
Comparable接口和Comparator接口的作用?

答:

Comparable接口:

也叫做可比较接口,这个接口在java.lang包下,只要根据指定类型的排序规则实现了这个接口,就是可排序的。这个接口中只定义了一个 compareTo(Object o) 方法,该方法的返回值类型是整型,如果当前对象大于参数对象就返回正数,当前对象等于参数对象就返回0,当前对象小于参数对象就返回负值,这样写就是升序排列,反之则是进行降序排列。

Comparator接口:

比较器Comparator接口,是另一种对自定义类型对象的集合整体排序的方法,存在于java.util包下。这个接口中定义了一个 compare(Object o1,Object o2) 方法来比较两个对象,这个方法的返回值定义和上面介绍的那个方法是一样。利用这种方式,则在创建集合的时候把定义好的比较器作为参数,构造一个集合。

一次搞定内部类?

答:

1、静态内部类:静态内部类定义在类中,任何方法外,用static修饰

静态内部类只能访问外部类的静态成员。
在外部类的外部,要创建一个静态内部类对象不需要外部类对象:
Outer.Inner in = new Outer.Inner();
在本类内部生成内部类对象的方式:
Inner in = new Inner();

2、成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列
在内部类中可以直接访问外部类的私有属性。
内部类和外部类的实例变量允许命名冲突。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性
在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
在本类内部生成内部类对象的方式:
在静态方法中:Inner in = new Outer().new Inner();
在非静态方法中:Inner in = this.new Inner();
成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。

3、局部内部类:在外部类的方法中定义的内部类
与局部变量类似,在局部内部类前不可以加修饰符public和private,其作用域为定义它的代码块。
局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量,但要求外部类的局部变量必须为final的。
配合接口使用,来做到强制弱耦合。
在外部类的外部不可创建局部内部类对象,只能在局部内部类所在的方法中创建:
Inner in = new Inner();

4、匿名内部类:一种特殊的局部内部类
没有名字,也没有class、extends、implements关键字
用一种隐含的方式实现一个接口或继承一个类,并且只能创建一次实例。
实现方式:在某个语句中,new 父类/父接口名字(){ 类体中实现方法 }
例如:
TreesSet ts = new TreeSet(new Comparator(){
public int compare(Object o1, Object o2){
return 0;
}
});
匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须合类名相同,而匿名内部类没有类名。

线程的生命周期?

答:

1)初始状态:此时线程只是处于JVM进程中,只是创建了一个线程对象,并没有真正开始运行。

2)可动行状态:调用线程对象的start()方法,此时线程才真正的被创建,进入可运行状态,等待CPU的调度。“万事俱备,只欠CPU”。

3)运行状态:正在运行的线程,此时它拥有CPU的执行权。

4)阻塞状态:运行状态中的线程,如果正在等待用户输入或调用了sleep()和join()等方法都会导致线程进入阻塞状态,注意从阻塞状态出来的线程不一定马上回到运行状态,而是重新回到可运行状态,等待CPU的再次调度。

5)等待队列状态:一个线程调用一个对象的wait()会自动放弃该对象的锁标记,进入等待队列状态,只有当有另外一线程调用临界资源的notify()或notifyAll()方法,建议多使用notifyAll(),才会将等待队列中的线程释放,此线程进入锁池状态。

6)锁池状态:每个对象都有互斥锁标记,以防止对临界资源的访问造成数据的不一致,和数据的不完整性。一个线程拥有一个对象的锁标记后,另一线程想访问该对象,必须在锁池中等待。由系统决定哪个线程拿到锁标记并运行。注意从锁池状态出来的线程不是马上回到运行状态,而是重新回到可运行状态,等待CPU的再次调度。

7)终止状态:一个线程运行结束后称为终止状态,一个进程中只有所有的线程退出后才会终止。

如何得到集合的线程安全的集合?

答:

Collections类中的synchronizedXxxx(Xxxx ss)方法可以得到相应集合的线程安全的集合。

线程同步要注意的事项?

在同步语句块中不能直接操作对象锁正在使用的对象。

对象与锁一一对应。

同步依赖对象锁,锁对象相同,同步语句串行,锁对象不同,同步语句并行。

顺序锁,不要回调,反向打开。

能不用同步就不用同步,有数据共享冲突时才使用同步。

什么情况下释放锁?

答:

同类代码执行完毕。

异常未处理,错误退出。

调用wait()。

相关方法:
1) wait():交出锁和CPU的占用; 
2) notify():将从对象的等待池中移走一个任意的线程,并放到锁池中,那里的对象一直在等待,直到可以获得对象的锁标记。 
3) notifyAll(): 将从等待池中移走所有等待那个对象的线程并放到锁池中,只有锁池中的线程能获取对象的锁标记,锁标记允许线程从上次因调用wait()而中断的地方开始继续运行。

注意: 用notifyAll()取代notify(),因为在调用notify()方法时,是由系统决定释放出哪个线程。

只能对加锁的资源进行wait()和notify()。
判断是否进行等待wait()时,用while代替if来进行判断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: