参考舍友总结的:
JAVA原生
Object,HashCode,equals
在Java中,
Object
是所有类的基类。每个类都默认继承了 Object
类,这意味着每个对象都有 Object
类的方法。其中最常被重写的两个方法就是 hashCode()
和 equals()
。1.
equals(Object obj)
方法:equals()
方法主要用来测试两个对象是否在逻辑上相等,也就是说,它们是否代表了相同的事物,不一定要是同一个对象。默认情况下,equals()
方法与 ==
操作符的行为完全相同,也就是说它检查两个对象是否是同一个对象。但在很多情况下,我们可能需要重写 equals()
方法,以便它可以根据我们自己的业务逻辑来判断两个对象是否相等。2.
hashCode()
方法:hashCode()
方法用于获取对象的哈希码,这个哈希码由对象的内存地址经过哈希函数计算得出。哈希码通常用于确定对象在哈希集合(例如 HashMap
、HashSet
等)中的存储位置。hashCode()
方法的默认行为是返回对象的内存地址。但和 equals()
方法一样,我们可以根据需要重写 hashCode()
方法。3.
equals()
和 hashCode()
的关系:当你重写
equals()
方法时,通常也需要重写 hashCode()
方法,以保持它们之间的一致性。也就是说,如果两个对象在 equals()
方法中被判断为相等,那么它们的 hashCode()
方法也应该返回相同的结果。反之,如果两个对象的 hashCode()
相同,那么它们并不一定相等,因为不同的对象可能会有相同的哈希码(这种情况被称为哈希冲突)。以下是一个简单的例子,展示了如何重写
equals()
和 hashCode()
方法:这个
Person
类重写了 equals()
和 hashCode()
方法。equals()
方法检查两个 Person
对象是否有相同的 name
和 age
。hashCode()
方法返回一个基于 name
和 age
的哈希码。volatile
在Java中,
volatile
是一个关键字,用于修饰变量,以确保其在多线程环境中的可见性和顺序性。1. 可见性:
在多线程环境中,为了提高效率,每个线程都会有自己的工作内存(可以理解为CPU的高速缓存),线程对变量的所有操作都在自己的工作内存中进行,然后再将改变的值刷新到主内存中。因此,如果一个线程修改了一个变量的值,其他线程可能无法立即看到这个改变。如果一个变量被声明为
volatile
,JVM保证了每次读取该变量都将从主内存中进行,每次写入都将立即同步回主内存,从而保证了变量在多个线程间的可见性。2. 顺序性(即禁止指令重排序):
在执行程序时,为了提高性能,编译器和处理器可能会对指令进行重排序。但是,当变量被声明为
volatile
时,JVM会禁止对其相关的指令进行重排序,也就是说,所有在对volatile
变量进行写操作之前的操作都必须在写操作完成之前执行,所有在读操作之后的操作都必须在读操作完成之后执行。然而,需要注意的是,虽然
volatile
关键字可以保证单个读/写操作的原子性,但它不能保证复合操作(如i++
)的原子性。因此,如果需要对复合操作进行同步,你可能需要使用synchronized
关键字或java.util.concurrent
包中的一些类。以下是一个使用
volatile
关键字的简单示例:在这个例子中,
count
变量被声明为volatile
,这意味着在多线程环境中,所有线程都能够看到最新的count
值,而且对count
的读/写操作不会被指令重排序。但是,incrementCount
方法并不是线程安全的,因为count++
是一个复合操作。- 作者:Olimi
- 链接:https://olimi.icu/article/2f8d4a58-a470-4edb-852b-71eb82f6d25c
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。