最近,网上有很多总结java面试题的文章。其中一些包含了许多基础问题,另一些包含了特殊领域的特殊问题,如多线程。在接下来的日子里,我们将不会太多的涉及到基础性的问题,我们将会提供一些特别点的东西。对于基础问题,你可以阅读 Java Interview Questions(链接: http://www.tutorialspoint.com/java/java_interview_questions.htm)。
基础
1、 什么是原生数据类型?Java中有多少种原生数据类型?它们分别是什么?
– 原生数据类型被语言预定义并且用保留关键字命名。原生数据类型的值不和其他原生数据类型的值共享状态。
–Java中有8中原生数据类型。它们分别是boolean,byte,char,short,int,long,float,double
2、 “byte b = (byte) -256”中b的值是多少?转换过程是怎么样的?
– b将等于0。-256将首先被转换成int类型(因为在Java中最小的数据单元是32位),然后它将向下类型转换成byte类型。当进行向下类型转换时,开头的三个字节都会被舍去并且把最后一个字节的值赋给b。(注:可以结束计算机组成原理中的知识进行理解)
3、 StringBuffer和StringBuilder之间有什么区别?
– StringBuffer在Java1.0引入,而StringBuilder在Java1.5才引入。
–StringBuffer是线程安全的。
–StringBuilder由于没有同步,所以执行更快。
4、 throwable各类型之间有何区别?
– 包含:UncheckedException(非检查异常), CheckedException(检查异常) 和 Error(错误)。
– UncheckedExceptions (非检查异常)包括运行时异常、错误以及它们的子类。例如,数组越界异常、除零异常、数学异常等。
– CheckedExceptions (检查异常)就是除UncheckedExceptions 的异常,它们必须被显示的捕捉。
5、 为什么java 8引入接口的缺省方法?
– 这是因为Java 8引入引入了一些其他的特性,其中包括Lambda表达式和流的接口。为了使用这些特性,一些已经存在的接口,包括集合,需要需要更新来增加更多的方法。然而,鉴于这些接口的特征,如果我们给接口添加一个方法,那已经实现了这些接口的类也需要实现这个方法。这就迫使开发人员去更新他们已经写好的代码来实现这个新方法。所以为了向后兼容,缺省方法被引入用来为这些接口提供缺省的行为。所有实现这些接口的类可以根据需要重写这些方法,而不再是必须重写。
6、 有缺省方法的接口与抽象类之间的区别是什么?
– 接口被设计用来为不知道接口具体实现的外部用户提供接口。
– 缺省方法是给接口增加的另外的方法,主要是用来向后兼容的。
– 抽象类是必须被继承的类,它可以有状态和构造方法。
– 一个类可以实现多个接口,但只能继承一个抽象类。
7、 一个类实现两个具有相同缺省方法的接口会怎么样?
– 如果实现这些接口的类没有实现它自己的这个缺省方法,这将会出现编译错误,因为编译器不知道使用哪个方法。
8、 枚举和迭代器有什么区别?
– 在不知道集合实现时所用的具体的数据结构的情况下,枚举和迭代器都提供了遍历集合的方法。
– 迭代器比枚举提供了更多的功能,并且它是用来代替枚举的。它们之间的具体区别可以参考Difference between Enumeration and Iterator in java interview question and answer(链接为: http://www.pixelstech.net/article/1335876112-Difference-between-Enumeration-and-Iterator-in-java-interview-question-and-answer)。
9、 String.length()和String.getBytes().length总是返回同样的值吗?
– 不。String.length() 返回字符串中字母的个数,而String.getBytes().length返回字符串所对应的字节数组中字节的个数。如果编码为URF-16,Java中一个字符占两个字节,那么String.getBytes().length 将会是String.length()的两倍。如果编码为UTF-8,且字符串中包含非ASCII字符,那将不会等于String.length()的两倍。具体请参考String.length() vs String.getBytes().length in Java(链接为: http://www.pixelstech.net/article/1427944920-String-length%28%29-vs-String-getBytes%28%29-length-in-Java)。
多线程
1、 ConcurrentHashMap和Collections.synchronizedMap()比较?
– 参考ConcurrentHashMap vs Collections.synchronizedMap()(链接为:http://www.pixelstech.net/article/1394026282-ConcurrentHashMap-vs-Collections-synchronizedMap%28%29)。
2、 什么时候会出现ConcurrentModificationException(并发修改异常)?
– 如果一个集合的迭代器正在对集合进行遍历时修改集合,那么将发生ConcurrentModificationException(并发修改异常)。例如,如果你正在使用迭代器对一个集合做循环时,你尝试给集合删除或者添加元素。
3、为什么我们需要慎重使用ThreadLocal?
– 被ThreadLocal 引用的对象属于这个线程,即只要这个线程没有终止,这个对象都将会被引用。如果多线程被重用 ,例如在web容器中,这可能将造成潜在的内存溢出。请阅读 Use Java ThreadLocal with caution (链接为:http://www.pixelstech.net/article/1399361023-Use-Java-ThreadLocal-with-caution)。
4、 什么时候将出现锁?什么时候将出现死锁?
– 当两个或者多个线程访问同一个资源并且该资源正在被一个线程占用时将出现锁。
– 简单地说,当一个线程锁定了一些A资源并且正在等待一些B资源,然而同时,另一个线程锁定了一些B资源并且正在等待A资源时,将出现死锁。
5、Thread.start()和Thread.run()有什么区别?
– Thread.start()将首先调用系统接口来启动一个线程,然后调用Thread.run() 方法来运行线程中的任务。这将为这个线程创建新的访问控制上下文(AccessControlContext)和栈。
– Thread.run() 将执行线程中的任务,但不会创建新的线程。相反,它将在调用该方法的线程中执行这些任务。请不要手动调用该方法。请使用Thread.start()。
提高
1、 Java中有哪些不同的引用类型?
– 强引用,软引用,弱引用和虚引用。
2、 软引用和虚引用之间有什么区别?
– 软引用只有在内存使用率非常高并且将要发生内存溢出错误时才会被垃圾收集器回收。
– 虚引用在垃圾收集器回收内存时将被回收。
3、 NoClassDefFoundError和ClassNotFoundException有什么区别?
– NoClassDefFoundError意思是这个在编译期出现了但是在运行期找不到。这可能是由于这个类在运行期被移除,或者这个类被不同的类加载器加载,或者在先前的加载过程中出现了异常。
– ClassNotFoundException意思是这个类在动态加载时找不到。例如当someClass在这里不存在且调用Class.forName(“someClass”)时。
– 因为NoClassDefFoundError是一个错误,所以当尝试去处理这个错误时应该捕捉Throwable而不是捕捉Exception(异常)。
【翻译自: http://www.pixelstech.net/article/1446351139-Java-Interview-Questions】