什么是 Java 记录? 关于 Java 最常见的抱怨之一是您需要编写大量代码才能使一个类成为
有用。很多时候您需要编写以下内容:
- toString()
- hashCode()
- 等于()
- Getter 方法
- 公共构造函数
对于简单的领域类,这些方法通常很无聊,
重复的,以及很容易产生的那种东西
机械地(并且 IDE 通常提供此功能),但截至目前,
语言本身并没有提供任何方法来做到这一点。
记录的目标是扩展 Java 语言语法并创建一个
可以说一个类是“字段,只是字段,什么都没有
但田野。”通过你对一个班级做出这样的陈述,
编译器可以通过自动创建所有方法并拥有
所有字段都参与hashCode()等方法。
记录带有一个记录内所有属性的hashCode()、equals() 和toString() 的默认实现
hashCode()的默认实现
记录将使用记录内所有属性的哈希码
默认实现 equals()
记录将使用所有属性来决定两个记录是否相等
所以任何哈希实现,例如HashSet、LinkedHashSet、HashMap、LinkedHashMap、
etc 将使用hashCode(),如果发生任何冲突,将使用equals()
默认实现还是自定义实现?
如果您想使用hashCode() 和equals() 中的所有属性,请不要覆盖
是否需要为记录重写 hashCode() 和 equals()?
由您决定保留默认实现或仅选择一些属性
任何东西,但如果你想要自定义属性,你可以覆盖来决定哪个
属性决定相等,属性决定hashCode
默认实现中hashCode是如何计算的?
将像这样使用整数和字符串的 hashCode:
int hashCode = 1 * 31;
hashCode = (hashCode + "a".hashCode()) & 0x7fffffff;
,下面的代码带有hashCode()、equals()的默认实现
和toString()。
HashSet 没有添加它们两个,因为这两个记录具有相同的 hashCode 和 equals
static record Record(int id, String name) {
}
public static void main(String[] args) {
Record r1 = new Record(1, "a");
Record r2 = new Record(1, "a");
Set<Record> set = new HashSet<>();
set.add(r1);
set.add(r2);
System.out.println(set);
System.out.println("Hashcode for record1: " + r1.hashCode());
System.out.println("Hashcode for record2: " + r2.hashCode());
int hashCode = 1 * 31;
hashCode = (hashCode + "a".hashCode()) & 0x7fffffff;
System.out.println("The hashCode: " + hashCode);
}
,输出
[Record[id=1, name=a]]
Hashcode for record1: 128
Hashcode for record2: 128
The hashCode: 128
,资源:
blogs oracle