java语言思考题
思考题一
1 |
|
控制台会输出什么?
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语言思考题/
Powered By Valine
v1.5.1
v1.5.1