【03】【JAVA常见面试题】

1、线程的五种状态
  1、新建状态:线程已被创建但尚未执行(start() 尚未被调用)。
  2、可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。
  3、死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。

  4、阻塞状态:线程不会被分配 CPU 时间,无法执行。

        5、等待状态:分为有限等待,无限等待。

2、什么集合类没有实现Cloneable和Serializable接口

        都实现了。

3、什么是迭代器(Iterator)?

        Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的

迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。

4、Iterator和ListIterator的区别是什么?

        1、Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。

        2、Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。

        3、ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

5、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

        Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

6、Java中的HashMap的工作原理是什么?

        Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

7、HashMap和Hashtable有什么区别?

        1、HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:

        2、HashMap允许键和值是null,而Hashtable不允许键或者值是null。

        3、Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。

        4、HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。

        5、一般认为Hashtable是一个遗留的类。

8、Array和ArrayList的不同点?

        1、Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

        2、Array大小是固定的,ArrayList的大小是动态变化的。

        3、ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

        4、对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

9、Comparable和Comparator接口是干什么的?列出它们的区别。

        Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

        Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

10、什么是Java优先级队列(Priority Queue)?

        PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

11、Java集合类框架的最佳实践有哪些?

        1、根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。

        2、有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。

        3、为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。

        4、使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。

        5、编程的时候接口优于实现。

        6、底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。

12、Enumeration接口和Iterator接口的区别有哪些?

        Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

13、Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

        JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。

        堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

14、JVM的永久代中会发生垃圾回收么?

        垃圾回收一般不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。





【参见】【http://www.importnew.com/10980.html】




你可能感兴趣的:(java,面试)