1. 为什么重写 equals() 时候必须重写 hashCode()
因为两个相等的对象的 hashCode 值必须是相等。也就是说如果 equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。
如果重写 equals() 时没有重写 hashCode() 方法的话就可能会导致 equals 方法判断是相等的两个对象,hashCode 值却不相等。
2. 字符串常量池
字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
3. 字符串中的 intern() 方法
String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:
● 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
● 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。
4. try-catch-finally
注意:不要在 finally 语句块中使用 return! 当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。
以下代码会输出啥:
int a = 10; try { int b = a / 0; return a; }catch (Exception e){ return 20; }finally { a = 30; return a; }
int a = 10; try { int b = a / 0; return a; }catch (Exception e){ return 20; }finally { a = 30; }
int a = 10; try { int b = a / 1; return a; }catch (Exception e){ return 20; }finally { a = 30; }
详解:
执行流程: 1. 先计算返回值, 并将返回值存储起来, 等待返回 2. 执行finally代码块 3. 将之前存储的返回值, 返回出去; 需注意: 1. 返回值是在finally运算之前就确定了,并且缓存了,不管finally对该值做任何的改变,返回的值都不会改变。 SO:
5. finally 中的代码不一定会执行
在编程中,使用try-catch-finally块时,finally中的代码确实有些情况下可能不会执行。以下是几种情况:
程序终止:如果在try或catch块之前发生了无法恢复的错误或程序异常终止,那么finally中的代码将不会执行。
线程终止:如果在try或catch块中的线程被强制终止,那么finally中的代码也不会执行。
关闭JVM:如果在try或catch块中关闭了Java虚拟机(JVM),则finally中的代码不会执行。
需要注意的是,这些情况属于异常情况,一般情况下finally中的代码都会执行。finally块通常用于确保资源的释放或清理,无论是否有异常抛出。