`
sunsy
  • 浏览: 37645 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Equals and Hashcode

阅读更多
同事问了个关于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@125
false
[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_hashcode_Comparing_

    在`Comparing Java objects with equals and hashcode.pdf`文档中,可能会详细讨论这些方法的实现细节、最佳实践和潜在陷阱,例如: - 如果重写了`equals()`,也应该重写`hashCode()`,以遵循合同约定。 - 当`...

    如何在IDEA中对 hashCode()和 equals() 利用快捷键快速进行方法重写

    在Java编程中,`equals()`和`hashCode()`方法是Object类中的两个重要方法。当我们创建自定义类并将其对象放入集合(如HashSet)时,往往需要重写这两个方法以确保集合能够正确地处理这些对象。IntelliJ IDEA,作为一...

    idea资料.zip

    - **ToString, Equals and HashCode**: 自动生成对象的toString(), equals() 和 hashCode() 方法。 - **Convert to Arcface**: 对于Spring Boot项目,可自动生成Repository、Service、Controller等层的代码。 3. ...

    Java常用快捷键。绝对常用。个人总结。

    5. **生成equals()和hashCode()**:`Alt + Shift + S`,然后选择`Equals and HashCode`。 三、导航和跳转快捷键 1. **打开类型/文件**:`Ctrl + Shift + T` 和 `Ctrl + Shift + R`,快速定位类或文件。 2. **最近...

    C# Equals 和 GetHashCode 方法重写

    4. 在弹出的窗口中选择 “生成 `Equals` 和 `GetHashCode` 方法” (`Generate Equals and GetHashCode Methods`)。 5. 如果需要,还可以选中 “实现 `IEquatable&lt;T&gt;` 泛型接口” (`Implement IEquatable&lt;T&gt; Generic ...

    java 开发规范

    Object Model Violation: Just one of equals() and hashCode() Defined ABSTRACT This class overrides only one of equals() and hashCode().

    Generatable:可生成-Intellij IDEA插件

    可产生的可生成-Intellij IDEA插件插件向“生成”菜单添加了一些操作: Generate inner Builder classGenerate All: getters, equals and hashCode, toString, Constructor, Builder也可以看看: FuGen - You can ...

    eclipse-guava-插件

    4. 生成`hashCode()`和`equals()`:在类定义内,使用Eclipse的代码生成功能(通常快捷键是`Alt + Shift + S`,然后选择`Generate hashCode() and equals()`),选择Guava插件提供的选项。 5. 自动格式化:生成的...

    sonar检查规则指南

    "equals(Object obj)" and "hashCode()" should be overridden in pairs - **解释**:根据Java的约定,如果重写了`equals`方法,那么也应该重写`hashCode`方法,以保持一致性。 - **解决方案**:确保这两个方法...

    hibernate3 注释生成复合主键或者嵌入式主键的方法及实例.doc

    // getters, setters, equals() and hashCode() } ``` 2. 使用注解标记实体类: 在实体类(如`UserRole`)中,我们需要使用`@IdClass`注解指定复合主键类,并为每个主键字段添加`@Id`注解。例如: ```java ...

    lombok.jar在eclipse和sts中做相应配置可以代替get、set

    Lombok是一款Java库,它通过注解的方式简化了Java类中常见的getter、setter、equals、hashCode以及toString等方法的编写工作,极大地提高了开发效率。对于开发者而言,只需要在对应的字段或者类上添加特定的Lombok...

    通过Lombok来简化你的代码1

    Lombok是一款java库,主要用来简化java代码的编写,通过使用注解,可以减少大量的getter、setter、equals、hashCode、toString等方法的编写,从而提高开发效率。 安装Lombok 要使用Lombok,需要先安装Lombok插件。...

    effective-java 配套代码

    6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())**: 代码展示了如何正确实现这两个方法以遵循合同,尤其是在实现集合类时的注意事项。 7. **接口与抽象类(Interfaces vs Abstract ...

    java 自动生成javaBean 利器

    这样,你就不需要手动编写那些单调的getter、setter、构造函数以及equals、hashCode和toString方法。 `AutoDTD.java`文件很可能是这个生成器的主要实现类。在这个类中,可能包含了解析输入数据、构建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...

    hibernate_reference.pdf

    - **Implementing equals() and hashCode()**: Discusses the importance of implementing these methods for entities to ensure correct behavior in Hibernate. - **Dynamic Models**: Introduces dynamic models...

    XStream Deserializable Vulnerablity And Groovy CVE-2015-3253漏洞分析

    因为`hashCode()`在比较对象时起着关键作用,当两个对象被视为相等时,它们的`hashCode`和`equals`方法的返回值应相同。在默认情况下,未重写的`hashCode`和`equals`方法将继承自父类。因此,当恶意构造的`...

    Java面试宝典Beta5.0.pdf

    7. equals和hashCode方法:在Java中,两个对象equals方法返回true,意味着它们是等价的,但是这两个对象的hashCode方法返回值可以不同。散列码用于确定对象在散列表中的索引位置,建议覆盖equals方法时也覆盖...

    第19章编程题提交1

    通常,`equals`方法会配合`hashCode`方法一起重写,以满足`equals`和`hashCode`的合同。在`TwoTuple, T2&gt;`类中,`equals`方法应该比较两个元组的`T1`和`T2`部分是否分别相等: ```java @Override public boolean ...

Global site tag (gtag.js) - Google Analytics