关于Java的面试题总结(第一天)

avatar
作者
猴君
阅读量:4

一、Arrays.sort是使用什么排序算法实现的

典型回答

Arrays.sort是Java中提供的对数组进行排序的方法,根据参数类型不同,他提供了很多的重载方法:

public static void sort(Object[] a); public static void sort(byte[] a); public static void sort(float[] a); public static void sort(int[] a); 

而针对不同的参数类型,采用的算法也不尽相同,首先,对于比较常见的基本数据类型(如int、double、char等)的数组,就是采用JDK 1.7中引入的 双轴快速排序

public static void sort(int[] a){ 	DualOivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0); 	} 

这里的DualOivotQuicksort.sort就是双轴快速排序的具体实现。

双轴快速排序是对传统快速排序的改进。它通过选择两个轴值来划分数组,并在每一个划分区域中进行递归排序。这种算法通常比传统的快速排序更快,特别是在大量重复元素的情况下。双轴快速排序算法是JDK7中引入的,并在后续版本中进行了优化和改进。 

而针对另一个类型,对于对象数组的排序,它支持两种排序方式,即归并排序和TimSort:

// 1.7以前 public static void sort(Object[] a) {     Object[] aux = (Object[])a.clone();     mergeSort(aux, a, 0, a.length, 0); }  // 1.7以后 public static void sort(Object[] a) {     if (LegacyMergeSort.userRequested)         legacyMergeSort(a);     else         ComparableTimSort.sort(a, 0, a.length, null, 0, 0); }  /** To be removed in a future release. */ private static void legacyMergeSort(Object[] a) {     Object[] aux = a.clone();     mergeSort(aux, a, 0, a.length, 0); } 

这里面的MergeSort指的是归并排序,这个算法是老板版本设计的,后续版本中可能被移除了,新的版本主要采用TimSort算法、

TimSort是一种混合排序算法,结合了归并排序(Merge Sort)和插入排序(Insertion Sort)的特点 

二、final、finally、finalize有什么区别?

典型回答

final、finally、finalize是Java中的三个不同的概念。

  • final:用于声明变量。方法或者类,使之不可变、不可重写或不被继承
  • finally:是异常处理的一部分,用于确保代码块(通常用于资源清理)总是执行。
  • finalize:是Object类的一个方法,用于在对象被垃圾回收前执行清理操作,但不推荐使用。

三、finally的代码一定会被执行吗?

典型回答

通常情况下,finally的代码一定会被执行,但有一个前提:
1、对应的try语句块被执行
2、程序正常执行

如果没有符合这两个条件的话,finally中的代码不会被执行,如果发生一下几个情况的话,都会导致finally不会执行:

  • 1、System.exit()方法执行
  • 2、Runtime.getRuntime().halt()方法被执行
  • 3、try或者catch中有死循环
  • 4、操作系统强制杀掉了JVM进制,如执行了kill -9
  • 5、其他原因导致的虚拟机崩溃了
  • 6、虚拟机所运行的环境挂了,如计算机电源断了
  • 7、如果一个finally是由守护线程执行的,那么是不保证一定能执行的,如果这时候JVM要退出,JVM会检查其他非守护线程,如果都执行完了,那么就直接退出了。这时候finally可能就没办法执行完。

四、char能存储中文吗?

典型回答

在Java中,char类型是用来表示一个16位(12字节)的Unicode字符,他可以存储任何Unicode字符集中的字符,当然也包括中文字符。

但是,有人说,Java中的char是没办法表示生僻字的,这么说其实有点绝对了。

因为Unicode字符集包含了几乎所有的字符,包括常见字符、生僻字、罕见字以及其他语言的字符。所以,用char类型其实是可以存储生僻字的。

但是,在处理生僻字时,需要确保Java源代码文件本身以及编译器和运行时环境都支持Unicode字符集。另外,如果在字符串中使用生僻字,也需要注意字符编码和字符串长度的问题。

还有一点需要注意,Unicode字符集的目标是覆盖世界上所有的字符。然而,由于生僻字的数量庞大且不断增长,Unicode字符集可能无法及时收录所有生僻字。这主要取决于Unicode标准的版本以及生僻字的使用频率和普及程度。

虽然Unicode字符集也在一直不断的迭代更新,但是对于一些非常罕见的生僻字,它们可能因为版本问题,或者时间问题,暂时不在Unicode字符集中。在这种情况下,可能就会无法表示。

五、ClassNotFoundException和NoClassDefFoundError的区别

典型回答

ClassNotFoundException是一个受检异常。他通常在运行时,在类加载阶段尝试加载类的过程中,找不到类的定义时触发。通常是由Class.forName()或类加载器loadClass或者findSystemClass时,在类路径中没有找到指定名称的类时,会抛出异常。表示所需的类在类路径中不存在。这通常是由于拼写错误或缺少以来导致的。
当classpath中没有对应的jar包时,就会抛出ClassNotFoundException

NoClassDefFoundError是一个错误,他表示运行时尝试加载一个类的定义时,虽然找到了类文件,但是在解析、加载或者链接类的过程中出现了问题。通常是由于依赖问题或者类定义文件损坏导致的,就是说这个类在编译时存在,运行时丢失,就会导致这个异常

扩展

NoSuchMethodError

NoSuchMethodError表示方法找不到,他和NoClassDefFoundError类似,都是编译时找得到,运行时找不到
这中error发生在生产环境中,通常大概率是发生在jar包冲突。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!