【Java】Java核心要点总结 68

文章目录

  • 1. 为什么重写 equals() 时候必须重写 hashCode()
  • 2. 字符串常量池
  • 3. 字符串中的 intern() 方法
  • 4. try-catch-finally
  • 5. finally 中的代码不一定会执行


在这里插入图片描述

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:

上面的输出分别为:30 20 10

5. finally 中的代码不一定会执行


在编程中,使用try-catch-finally块时,finally中的代码确实有些情况下可能不会执行。以下是几种情况:

  • 程序终止:如果在try或catch块之前发生了无法恢复的错误或程序异常终止,那么finally中的代码将不会执行。

  • 线程终止:如果在try或catch块中的线程被强制终止,那么finally中的代码也不会执行。

  • 关闭JVM:如果在try或catch块中关闭了Java虚拟机(JVM),则finally中的代码不会执行。

需要注意的是,这些情况属于异常情况,一般情况下finally中的代码都会执行。finally块通常用于确保资源的释放或清理,无论是否有异常抛出。




在这里插入图片描述

你可能感兴趣的:(Java,java,jvm,开发语言)