java语言思考题

思考题一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ZeroTest {
public static void main(String[] args) {
try{
int i = 100 / 0;
System.out.print(i);
}catch(Exception e){
System.out.print(1);
throw new RuntimeException();
}finally{
System.out.print(2);
}
System.out.print(3);
}
}
JAVA

控制台会输出什么?

12

解释如下:

int i = 100 / 0; 这行代码会导致一个 ArithmeticException,因为除以零是一个数学上的不合法操作。
异常被捕获在 catch 块中,并在那里打印出数字1。
finally 块中的代码被执行,打印出数字2。
最后,System.out.print(3); 这行代码在 finally 块之后执行,打印出数字3。
但是,根据Java的异常处理规则,当 catch 块中抛出一个新的异常(如 RuntimeException)时,原始的 ArithmeticException 将被抑制,并且新的异常将成为控制流程中的主导异常。这意味着 finally 块之后的代码(即 System.out.print(3);)将不会执行。因此,最终输出的数字是1和2。

思考题二

JDK 1.7和到JDK8,HashMap有哪些改动,能否举例说明?

在JDK 1.7和JDK 1.8中,HashMap的实现和性能有显著差异,主要体现在以下几个方面:

  • 底层结构的变化
    JDK 1.7使用的是数组加链表的结构。
    JDK 1.8在此基础上增加了红黑树的支持。当链表长度大于一定阈值(默认为8)时,链表会转换为红黑树,从而提高插入和查询效率。
  • 初始化和扩容策略
    JDK 1.7在哈希表为空时,会先调用inflateTable()初始化一个数组。
    JDK 1.8则直接调用resize()进行扩容。
  • 插入节点的方式
    JDK 1.7中,插入节点使用的是头插法。
    JDK 1.8则使用尾插法。
  • hash函数的计算
    JDK 1.7中直接使用key的hashCode()值。
    JDK 1.8通过key的hashCode()值进行异或运算,并右移16位,以避免只依赖低位数据导致的冲突,使元素分布更均匀。
  • 扩容策略
    JDK 1.7在哈希表装填因子不小于0.5时扩容,容量翻倍。
    JDK 1.8在数组容量未达到64时,以2倍进行扩容;超过64之后,若链表长度大于7,则将链表转换为红黑树。

这些变化使得JDK 1.8中的HashMap在处理高并发和大数据量时更加高效和稳定。特别是红黑树的引入,大大提高了插入和查询的效率,减少了时间复杂度。此外,尾插法的使用也避免了JDK 1.7中可能出现的死循环问题。


java语言思考题
http://example.com/2024/03/26/java语言思考题/
作者
WHC
发布于
2024年3月26日
许可协议
Powered By Valine
v1.5.1