发布于: 2023-10-9最后更新: 2023-12-21字数 00 分钟

参考舍友总结的:

JAVA原生

Object,HashCode,equals

在Java中,Object 是所有类的基类。每个类都默认继承了 Object 类,这意味着每个对象都有 Object 类的方法。其中最常被重写的两个方法就是 hashCode()equals()
1. equals(Object obj) 方法:
equals() 方法主要用来测试两个对象是否在逻辑上相等,也就是说,它们是否代表了相同的事物,不一定要是同一个对象。默认情况下,equals() 方法与 == 操作符的行为完全相同,也就是说它检查两个对象是否是同一个对象。但在很多情况下,我们可能需要重写 equals() 方法,以便它可以根据我们自己的业务逻辑来判断两个对象是否相等。
2. hashCode() 方法:
hashCode() 方法用于获取对象的哈希码,这个哈希码由对象的内存地址经过哈希函数计算得出。哈希码通常用于确定对象在哈希集合(例如 HashMapHashSet 等)中的存储位置。hashCode() 方法的默认行为是返回对象的内存地址。但和 equals() 方法一样,我们可以根据需要重写 hashCode() 方法。
3. equals()hashCode() 的关系:
当你重写 equals() 方法时,通常也需要重写 hashCode() 方法,以保持它们之间的一致性。也就是说,如果两个对象在 equals() 方法中被判断为相等,那么它们的 hashCode() 方法也应该返回相同的结果。反之,如果两个对象的 hashCode() 相同,那么它们并不一定相等,因为不同的对象可能会有相同的哈希码(这种情况被称为哈希冲突)。
以下是一个简单的例子,展示了如何重写 equals()hashCode() 方法:
这个 Person 类重写了 equals()hashCode() 方法。equals() 方法检查两个 Person 对象是否有相同的 nameagehashCode() 方法返回一个基于 nameage 的哈希码。

volatile

在Java中,volatile是一个关键字,用于修饰变量,以确保其在多线程环境中的可见性和顺序性。
1. 可见性:
在多线程环境中,为了提高效率,每个线程都会有自己的工作内存(可以理解为CPU的高速缓存),线程对变量的所有操作都在自己的工作内存中进行,然后再将改变的值刷新到主内存中。因此,如果一个线程修改了一个变量的值,其他线程可能无法立即看到这个改变。如果一个变量被声明为volatile,JVM保证了每次读取该变量都将从主内存中进行,每次写入都将立即同步回主内存,从而保证了变量在多个线程间的可见性。
2. 顺序性(即禁止指令重排序):
在执行程序时,为了提高性能,编译器和处理器可能会对指令进行重排序。但是,当变量被声明为volatile时,JVM会禁止对其相关的指令进行重排序,也就是说,所有在对volatile变量进行写操作之前的操作都必须在写操作完成之前执行,所有在读操作之后的操作都必须在读操作完成之后执行。
然而,需要注意的是,虽然volatile关键字可以保证单个读/写操作的原子性,但它不能保证复合操作(如i++)的原子性。因此,如果需要对复合操作进行同步,你可能需要使用synchronized关键字或java.util.concurrent包中的一些类。
以下是一个使用volatile关键字的简单示例:
在这个例子中,count变量被声明为volatile,这意味着在多线程环境中,所有线程都能够看到最新的count值,而且对count的读/写操作不会被指令重排序。但是,incrementCount方法并不是线程安全的,因为count++是一个复合操作。

工程性实战经历—osg error opengl version test failed. requires valid graphics context
工程性实战经历—osg error opengl version test failed. requires valid graphics context