`
only_java
  • 浏览: 112660 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于hashset中hashcode 及 equals 的测试

    博客分类:
  • j2se
阅读更多

由于经常忘记关于hashset及hashmap中插入重复值时hashcode及equals的是怎样执行的,所以把一个例子记录下来来,省得以后忘记!首先引用老紫竹(java2000_net)的一个测试例子:

import java.util.HashSet;
import java.util.Set;

/**
 * 老紫竹JAVA提高教程(2)-认识Set集合之HashSet。<br>
 * Set用来保存不允许重复的数据。可以是任何对象类型。<br>
 * JDK5以后,主类型可以通过autobox 放入Set里面。
 * 
 * @author 老紫竹 JAVA世纪网(java2000.net)
 * 
 */
public class lession1 {
  public int age;
  public String name;


public static void main(String[] args) {

    // 测试HashSet的特殊性
    testForHashSet();

  }


  /**
   * 专门针对HashSet的测试。
   */
  public static void testForHashSet() {
    System.out.println("----- testForHashSet -----------");
    HashSet set = new HashSet();

    // 增加一个null对象
    set.add(null);
    // 我们再次看看集合里对象的数量
    System.out.println(set.size());
    // 再次增加一个null看看
    set.add(null);
    
    // 我们再次看看集合里对象的数量
    System.out.println(set.size());
 
    MyObject obj = new MyObject("java2000", 2);
    set.add(obj);
    System.out.println("1----");
    set.add(new lession1());
    System.out.println("2----");
    obj = new MyObject("csdn", 10);
    set.add(obj);

    // 我们再次看看集合里对象的数量
    System.out.println(set.size());

    // 判断是否包含某个对象
    System.out.println(set.contains(obj));

    obj = new MyObject("java2000_net", 2);
    set.add(obj);

    // 我们再次看看集合里对象的数量
    System.out.println(set.size());

    // 我们尝试把obj再次放入set看看
    // 并没有增加,因为是重复的
    System.out.println("---");
    set.add(obj);
    System.out.println(set.size());

    // 我们构造一个新的对象,内容和前面的相同
    obj = new MyObject("java2000_net", 2);
    set.add(obj);
    System.out.println(set.size());

    // 我们修改一下obj里面的年龄,再看看
    obj.setAge(3);

    // 我们再测试看看是否包含此对象。
    // 请注意,我们这个obj和前面的obj是同一个对象
    // 我们仅仅修改了一下我们的年龄
    System.out.println(set.contains(obj));

    // 我们尝试把obj再次放入set看看
    // 我们又增加了长度
    set.add(obj);
    System.out.println(set.size());
  }
    @Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + age;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	System.out.println("lession hashcode "+result);
	return result;
}

@Override
public boolean equals(Object obj) {
	System.out.println("lesson equals");
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	final lession1 other = (lession1) obj;
	if (age != other.age)
		return false;
	if (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	return true;
 }
}

/**
 * @author Administrator
 *
 */
class MyObject {
  private int age;
  private String name;

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  MyObject(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + age;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	System.out.println("hashCode"+result);
	return result;
}

@Override
public boolean equals(Object obj) {
	System.out.println("equals");
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	final MyObject other = (MyObject) obj;
	if (age != other.age)
		return false;
	if (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	return true;
}

 
}

   执行结果:

 

----- testForHashSet -----------
1
1
hashCode-582794785
1----
lession hashcode 961
2----
hashCode3064305
4
hashCode3064305
true
hashCode-337761603
5
---
hashCode-337761603
5
hashCode-337761603
equals
5
hashCode-337761572
false
hashCode-337761572
6

 从结果集中不难看出每在hashset中增加一个对象,就会执行一次hashcode。所以判断两个对象是否重复首先得判断hashcode是否相等。如果不相等则说明是两个不同的对象,可以插入。

 

那hashcode相等的情况下怎么判断是否重复呢?

满足如下条件之一即可:

条件1:插入的引用的是同一个对象且equals 相等。比如上例中的

 // 我们构造一个新的对象,内容和前面的相同
    obj = new MyObject("java2000_net", 2);
    set.add(obj);

 条件2:插入同一个引用。比如上例中的

 obj = new MyObject("java2000_net", 2);
 set.add(obj);

set.add(obj);

 此外这个例子还能说明一个问题:

如果是第二种插入

 

obj = new MyObject("java2000_net", 2);
 set.add(obj);

set.add(obj);

 

则不会进行euqals比较,直接认为是重复。相当于==成立,如果在第二次插入之间改变某一属性则可能会导致hashcode改变则直接可以插入,就如上例子中最后一些代码

 

// 我们修改一下obj里面的年龄,再看看
    obj.setAge(3);

    // 我们再测试看看是否包含此对象。
    // 请注意,我们这个obj和前面的obj是同一个对象
    // 我们仅仅修改了一下我们的年龄
    System.out.println(set.contains(obj));

    // 我们尝试把obj再次放入set看看
    // 我们又增加了长度
    set.add(obj);
 
分享到:
评论
1 楼 Technoboy 2011-05-19  
引用

public boolean equals(Object obj) {  
    System.out.println("equals");  
    if (this == obj)  
        return true;  
    if (obj == null)  
        return false;  
    if (getClass() != obj.getClass())  
        return false;  
    final MyObject other = (MyObject) obj;  
    if (age != other.age)  
        return false;  
    if (name == null) {  
        if (other.name != null)  
            return false;  
    } else if (!name.equals(other.name))  
        return false;  
    return true;  
}  


很少有在equals方法中比较进行Class对象的比较,这里只是匹配是否是同一类型,即用instanceof关键字

相关推荐

    hashcode和equals的分析

    为了使`Person`对象能够正确地工作在`HashSet`中,我们需要重写`hashCode`方法: ```java public class Person { private String name; private int age; // 构造器、getters和setters省略... @Override ...

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    在自定义类中,为了使对象能被HashSet或HashMap正确处理,通常需要重写hashCode()和equals()方法,确保它们遵循一致性原则。 在ArrayList和HashSet的比较中,我们可以总结以下几点: 1. 数据结构:ArrayList基于...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    java中hashcode()和equals()方法详解

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

    java中hashCode、equals的使用方法教程

    在Java编程语言中,`hashCode()` 和 `equals()` 方法对于对象的比较和处理至关重要,尤其在集合类(如Set和Map)中。这两个方法都源自`java.lang.Object`类,因此所有的Java类都默认继承了它们。理解并正确地重写这...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    hashcode()和equals()

    在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 或 `HashSet`)时。这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类...

    java中hashcode()和equals()的详解

    在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...

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

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

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    java中Hashcode的作用.docx

    在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演着关键角色。它可以快速地判断两个对象是否相等,从而提高散列表的性能。 证明Hashcode不是内存地址 有人认为Hashcode是对象在内存中的地址,但这是一种...

    equals,hashcode,toString

    在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    关于重写equals,hashcode以及compareTo方法!

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

    HashCode的用法详解

    在实际应用中,我们需要同时重新定义 equals() 和 hashCode() 方法,以便确保对象的唯一性。 例如,在 HashSet 中,我们需要定义 equals() 方法,以便判断两个对象是否相等。如果我们不定义 equals() 方法,那么同...

    java中hashcode()和equals()的详解.docx

    ### Java中`hashCode()`与`equals()`方法详解 #### 前言 在Java编程语言中,`hashCode()`与`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将...

    Java中的equals()和hashCode()契约Ja

    - 测试`equals()`和`hashCode()`的正确性,可以使用JUnit的EqualsTester类或自定义测试用例。 总之,`equals()`和`hashCode()`是Java中不可或缺的方法,它们对于对象的比较和哈希表操作起着核心作用。理解并正确...

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

Global site tag (gtag.js) - Google Analytics