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

JAVA常考面试题

2016-05-08 16:43 288 查看
1、 方法重载与覆盖的区别?( Overload 与 Override 的区别)

答:方法的重载属于编译时多态,方法名相同参数列表不同,返回值必须相同或都没有返回值类型。

方法的覆盖属于运行时多态,子类覆盖父类的方法,子类指向父类引用,在调用方法的时候用父类的引用调用。

2、 集合的实现类与区别?

答:Collection 接口,集合结构总的父接口,有两个子接口 list 和 set List 接口 元素有序可重复. 实现类有:

ArrayList 数组实现轻量级,运行快,线程不安全。 JDK1.2 查询快 Vector 数组实现重量级,运行慢,线程安全。

JDK1.0 LinkedList 链表实现 常用语堆栈与队列的实现 增删操作快 Set 接口 元素无序不可重复 实现类有:

HashSet,底层用 hashCode()算法实现,保证元素的无序唯一,自定义对象 存进 HashSet 为了保证元素内容不重复需要覆盖

hashCode()与 equals()方法。 SortedSet(不重要) 元素有序( Unicode 升序)唯一 TreeSet 要 求

元 素 有 序 , 自 定 义 的 对 象 需 要 实 现 Comparable 接 口 的compareTo( object o)方法

Map(接口): 与 Collection 接口无关,有一个子接口 SortedMap 特点: 元素是 key-value,

key唯一,无序; value 可重复 实现类: HashMap 轻量级 线程不安全的,允许 key 或 value 为 null

JDK1.2 HashTable 重量级 线程安全的 不允许 key 或 value 为 null JDK1.0 Properties 是

HashTable 的子类,主键和值都是字符串 SortedMap:(不重要) 特点: key 唯一,有序(Unicode 升序)

实现类:TreeMap

3、 线程有几种状态,分别是哪些?(调用 run()和调用 start()的区别)

答: 1)、新建状态(New):新创建了一个线程对象。 2)、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的

start()方法。该 状态的线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用权。

3)、运行状态(Running):就绪状态的线程获取了 CPU,执行 run()方法。

4)、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃 CPU

使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种: (一)、等待阻塞:运行的线程执行 wait()方法,

JVM 会把该线程放入等待池中。 (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM

会把该线程放入锁池中。 (三)、其他阻塞:运行的线程执行 sleep()或 join()方法,或者发出了 I/O 请求时,

JVM会把该线程置为阻塞状态。当 sleep()状态超时、 join()等待线程终止或者超时、或者 I/O

处理完毕时,线程重新转入就绪状态。 5)、死亡状态(Dead):线程执行完了或者因异常退出了 run()方法,该线程结束生命周期。 当调用

start 方法的时候,该线程就进入就绪状态。等待 CPU 进行调度执行,此时还没有真正执行线程。当调用 run 方法的时候,是已经被

CPU 进行调度,执行线程的主要任务。

4、 sleep() 与 wait()的区别

1.这两个方法来自不同的类分别是, sleep 来自 Thread 类,和 wait 来自 Object类。

2.最主要是 sleep 方法没有释放锁,而 wait 方法释放了锁.sleep 不出让系统资源; wait 是进入线程等待池等待,出让系统资源,其他线程可以占用 CPU。一般 wait 不会加时间限制,因为如果 wait

线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll 唤醒等待池中的所有线程,才会进入就绪队列等待 OS

分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到 只能调用 interrupt()强行打断。

3.wait, notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而sleep 可以在任何地方使用。

4. Sleep 需要捕获异常,而 wait 不需要

5.共同点调用以后进入阻塞状态

5,简述synchronized和java.util.concurrent.locks.Lock的异同 ?

主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

6,ArrayList和Vector的区别?

这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的。

ArrayList与Vector的区别,这主要包括两个方面: (1)同步性:

Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector。

(2)数据增长:

ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,Vector增长原来的一倍,ArrayList增加原来的0.5倍。

7,HashMap和Hashtable的区别

(1)历史:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。

(2)Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 .

(3)值:只有HashMap可以让你将null作为一个表的条目的key或value.Hashtable不允许。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: