同事问了个关于equals和hashcode的问题,我写了个测试说明了一下有啥不同,为什么SUN的文档会说改写equals方法要改写hashcode方法(不改写当然可以,但在使用中会有些不一样的地方,从下面的代码可以看出来),要求equals为true时,hashcode值一样,equals为假时,hashcode并不要求一定要不一样。下面给出测试代码与测试结果来说明:
package test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class EqualsNHashcodeTest {
public static void main(String[] args) {
Set<SampleModel> s1 = new HashSet<SampleModel>();
Set<SampleModel1> s2 = new HashSet<SampleModel1>();
Set<SampleModel2> s3 = new HashSet<SampleModel2>();
List<SampleModel> l1 = new ArrayList<SampleModel>();
List<SampleModel1> l2 = new ArrayList<SampleModel1>();
List<SampleModel2> l3 = new ArrayList<SampleModel2>();
List<SampleModel> l4 = new ArrayList<SampleModel>();
List<SampleModel1> l5 = new ArrayList<SampleModel1>();
List<SampleModel2> l6 = new ArrayList<SampleModel2>();
Set<SampleModel> s4 = new HashSet<SampleModel>();
Set<SampleModel1> s5 = new HashSet<SampleModel1>();
Set<SampleModel2> s6 = new HashSet<SampleModel2>();
SampleModel m1 = new SampleModel("anny");
SampleModel m2 = new SampleModel("lily");
SampleModel m3 = new SampleModel("lily");
SampleModel1 n1 = new SampleModel1("anny");
SampleModel1 n2 = new SampleModel1("lily");
SampleModel1 n3 = new SampleModel1("lily");
SampleModel2 p1 = new SampleModel2("anny");
SampleModel2 p2 = new SampleModel2("lily");
SampleModel2 p3 = new SampleModel2("lily");
System.out.println(m2.equals(m3));
System.out.println(p2.equals(p3));
System.out.println(p2 + " vs " + p3);
System.out.println(p2 == p3);
s1.add(m1);
s1.add(m2);
s1.add(m3);
System.out.println(s1);
l1.add(m1);
l1.add(m2);
l1.add(m3);
System.out.println(l1);
s2.add(n1);
s2.add(n2);
s2.add(n3);
System.out.println(s2);
l2.add(n1);
l2.add(n2);
l2.add(n3);
System.out.println(l2);
s3.add(p1);
s3.add(p2);
s3.add(p3);
System.out.println(s3);
l3.add(p1);
l3.add(p2);
l3.add(p3);
System.out.println(l3);
l4.add(m1);
l4.add(m2);
System.out.println(l4.contains(m1));
System.out.println(l4.contains(m2));
System.out.println(l4.contains(m3));
l5.add(n1);
l5.add(n2);
System.out.println(l5.contains(n1));
System.out.println(l5.contains(n2));
System.out.println(l5.contains(n3));
l6.add(p1);
l6.add(p2);
System.out.println(l6.contains(p1));
System.out.println(l6.contains(p2));
System.out.println(l6.contains(p3));
s4.add(m1);
s4.add(m2);
System.out.println(s4.contains(m1));
System.out.println(s4.contains(m2));
System.out.println(s4.contains(m3));
s5.add(n1);
s5.add(n2);
System.out.println(s5.contains(n1));
System.out.println(s5.contains(n2));
System.out.println(s5.contains(n3));
s6.add(p1);
s6.add(p2);
System.out.println(s6.contains(p1));
System.out.println(s6.contains(p2));
System.out.println(s6.contains(p3));
}
}
class SampleModel {
String name;
public SampleModel(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof SampleModel))
return false;
SampleModel s = (SampleModel) obj;
return this.name.equals(s.name);
}
}
class SampleModel1 {
String name;
public SampleModel1(String name) {
this.name = name;
}
@Override
public int hashCode() {
char[] cs = this.name.toCharArray();
int temp = 0;
for (char c : cs) {
temp += Integer.MAX_VALUE % (int) c;
}
return temp;
}
}
class SampleModel2 {
public SampleModel2(String name) {
this.name = name;
}
String name;
@Override
public boolean equals(Object obj) {
if (!(obj instanceof SampleModel2))
return false;
SampleModel2 s = (SampleModel2) obj;
return this.name.equals(s.name);
}
@Override
public int hashCode() {
char[] cs = this.name.toCharArray();
int temp = 0;
for (char c : cs) {
temp += Integer.MAX_VALUE % (int) c;
}
return temp;
}
}
编译及运行结果:
E:\PlatEclipseWorkSpace\TestProject>javac test/EqualsNHashcodeTest.java
E:\PlatEclipseWorkSpace\TestProject>java test.EqualsNHashcodeTest
true
true
test.SampleModel2@125 vs
test.SampleModel2@125false
[test.SampleModel@61de33,
test.SampleModel@ca0b6,
test.SampleModel@14318bb]
[test.SampleModel@61de33,
test.SampleModel@14318bb,
test.SampleModel@ca0b6]
[test.SampleModel1@120,
test.SampleModel1@125,
test.SampleModel1@125]
[test.SampleModel1@120,
test.SampleModel1@125,
test.SampleModel1@125]
[test.SampleModel2@120,
test.SampleModel2@125]
[test.SampleModel2@120,
test.SampleModel2@125,
test.SampleModel2@125]
true
true
true
true
true
false
true
true
true
true
true
false
true
true
false
true
true
true
看下代码对下结果应该比较好理解,就不写很详细的注释了。而且注意LIST与SET中的不同。
更详细的建议去看文档和源代码,再对不明确的地方做下测试会更清楚些。
分享到:
相关推荐
在`Comparing Java objects with equals and hashcode.pdf`文档中,可能会详细讨论这些方法的实现细节、最佳实践和潜在陷阱,例如: - 如果重写了`equals()`,也应该重写`hashCode()`,以遵循合同约定。 - 当`...
在Java编程中,`equals()`和`hashCode()`方法是Object类中的两个重要方法。当我们创建自定义类并将其对象放入集合(如HashSet)时,往往需要重写这两个方法以确保集合能够正确地处理这些对象。IntelliJ IDEA,作为一...
- **ToString, Equals and HashCode**: 自动生成对象的toString(), equals() 和 hashCode() 方法。 - **Convert to Arcface**: 对于Spring Boot项目,可自动生成Repository、Service、Controller等层的代码。 3. ...
5. **生成equals()和hashCode()**:`Alt + Shift + S`,然后选择`Equals and HashCode`。 三、导航和跳转快捷键 1. **打开类型/文件**:`Ctrl + Shift + T` 和 `Ctrl + Shift + R`,快速定位类或文件。 2. **最近...
4. 在弹出的窗口中选择 “生成 `Equals` 和 `GetHashCode` 方法” (`Generate Equals and GetHashCode Methods`)。 5. 如果需要,还可以选中 “实现 `IEquatable<T>` 泛型接口” (`Implement IEquatable<T> Generic ...
Object Model Violation: Just one of equals() and hashCode() Defined ABSTRACT This class overrides only one of equals() and hashCode().
可产生的可生成-Intellij IDEA插件插件向“生成”菜单添加了一些操作: Generate inner Builder classGenerate All: getters, equals and hashCode, toString, Constructor, Builder也可以看看: FuGen - You can ...
4. 生成`hashCode()`和`equals()`:在类定义内,使用Eclipse的代码生成功能(通常快捷键是`Alt + Shift + S`,然后选择`Generate hashCode() and equals()`),选择Guava插件提供的选项。 5. 自动格式化:生成的...
"equals(Object obj)" and "hashCode()" should be overridden in pairs - **解释**:根据Java的约定,如果重写了`equals`方法,那么也应该重写`hashCode`方法,以保持一致性。 - **解决方案**:确保这两个方法...
// getters, setters, equals() and hashCode() } ``` 2. 使用注解标记实体类: 在实体类(如`UserRole`)中,我们需要使用`@IdClass`注解指定复合主键类,并为每个主键字段添加`@Id`注解。例如: ```java ...
Lombok是一款Java库,它通过注解的方式简化了Java类中常见的getter、setter、equals、hashCode以及toString等方法的编写工作,极大地提高了开发效率。对于开发者而言,只需要在对应的字段或者类上添加特定的Lombok...
Lombok是一款java库,主要用来简化java代码的编写,通过使用注解,可以减少大量的getter、setter、equals、hashCode、toString等方法的编写,从而提高开发效率。 安装Lombok 要使用Lombok,需要先安装Lombok插件。...
6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())**: 代码展示了如何正确实现这两个方法以遵循合同,尤其是在实现集合类时的注意事项。 7. **接口与抽象类(Interfaces vs Abstract ...
这样,你就不需要手动编写那些单调的getter、setter、构造函数以及equals、hashCode和toString方法。 `AutoDTD.java`文件很可能是这个生成器的主要实现类。在这个类中,可能包含了解析输入数据、构建Java源代码字符...
10 The Methods in the Object Class (finalize, hashcode, clone, getClass, equals) 11 Hiding Data Fields and Static Methods 12 Initialization Blocks 13 Extended Discussions on Overriding Methods 14...
- **Implementing equals() and hashCode()**: Discusses the importance of implementing these methods for entities to ensure correct behavior in Hibernate. - **Dynamic Models**: Introduces dynamic models...
因为`hashCode()`在比较对象时起着关键作用,当两个对象被视为相等时,它们的`hashCode`和`equals`方法的返回值应相同。在默认情况下,未重写的`hashCode`和`equals`方法将继承自父类。因此,当恶意构造的`...
7. equals和hashCode方法:在Java中,两个对象equals方法返回true,意味着它们是等价的,但是这两个对象的hashCode方法返回值可以不同。散列码用于确定对象在散列表中的索引位置,建议覆盖equals方法时也覆盖...
通常,`equals`方法会配合`hashCode`方法一起重写,以满足`equals`和`hashCode`的合同。在`TwoTuple, T2>`类中,`equals`方法应该比较两个元组的`T1`和`T2`部分是否分别相等: ```java @Override public boolean ...