一、Arrays.sort是使用什么排序算法实现的
典型回答
Arrays.sort是Java中提供的对数组进行排序的方法,根据参数类型不同,他提供了很多的重载方法:
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中引入的 双轴快速排序:
java
public static void sort(int[] a){
DualOivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}
这里的DualOivotQuicksort.sort就是双轴快速排序的具体实现。
text
双轴快速排序是对传统快速排序的改进。它通过选择两个轴值来划分数组,并在每一个划分区域中进行递归排序。这种算法通常比传统的快速排序更快,特别是在大量重复元素的情况下。双轴快速排序算法是JDK7中引入的,并在后续版本中进行了优化和改进。
而针对另一个类型,对于对象数组的排序,它支持两种排序方式,即归并排序和TimSort:
java
// 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算法、
text
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包冲突。