基础.md 2.5 KB

为什么重写 equals() 时必须重写 hashCode() 方法?

根据Java规范的规定,如果两个对象相等,那么它们的哈希值必须相等。也就是说如果 equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。如果重写 equals() 时没有重写 hashCode() 方法的话就可能会导致 equals 方法判断是相等的两个对象,hashCode 值却不相等。

例如hashset集合中插入的对象重写 equals()但是没有重写 hashCode() 就会导致插入重复的元素。

在java中,mian线程中申请某一个线程,main线程运行结束,申请的新线程为什么还会继续运行?

在 Java 中,与其他操作系统一样,线程是通过调度器来管理执行的。当一个进程中所有的非守护线程都执行完毕后,该进程会自动结束并终止所有守护线程。因此,如果在 main 线程中创建了一个新线程,main 线程结束之后,该新线程仍然会继续运行。

这是因为在Java中,除了守护线程以外,每个线程都是独立执行的,并且拥有自己独立的执行堆栈和执行上下文。在 main 线程中创建一个新线程后,该新线程会被 JVM 调度器分配 CPU 时间片,并独立运行。这时即使 main 线程结束,该新线程仍然可以继续运行,直到执行完毕或者被显式地终止。

需要注意的是,如果该新线程是守护线程,那么在所有非守护线程执行完毕后,JVM 会自动终止所有守护线程并退出进程。因此,如果该新线程是守护线程,则在 main 线程结束之后可能会被强制终止,而不会继续运行。

java线程生命周期

Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态:

  • NEW: 初始状态,线程被创建出来但没有被调用 start()
  • RUNNABLE: 运行状态,线程被调用了 start()等待运行的状态。
  • BLOCKED:阻塞状态,需要等待锁释放。
  • WAITING:等待状态,表示该线程需要等待其他线程做出一些特定动作(通知或中断)。
  • TIME_WAITING:超时等待状态,可以在指定的时间后自行返回而不是像 WAITING 那样一直等待。
  • TERMINATED:终止状态,表示该线程已经运行完毕。

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换

image-20230508161022413