`
啸笑天
  • 浏览: 3462505 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

26 ArrayList_HashSet的比较及Hashcode分析

 
阅读更多

 

只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的hashCode方法,但是为他提供一个hashCode方法也不会有什么不好,没准以后什么时候有用到这个方法了,所以,通常要求hashCode方法和equals方法一并被同时覆盖。

 

//HashSet比较时hashCode方法和equals方法都用了

HashSet:采用哈希算法的集合。实现了Collection接口,只能存入不同HashCode对象,即只存入不同的对象,如果希望存入具有相同内容的两个对象,则需覆盖对象的HashCode equals方法。

 

提示

1)通常情况,自己编程时要做到:一个类的两个实例对象用equals方法比较的结果相等时,他们的哈希吗也必须相等,但反之则不成立,即equals方法比较的结果不相等的对象可以有相等的哈希吗或者说哈希吗相等的两个对象的equals方法的比较的结果可以不相等。因为默认的equals方法比较的是hashcoad值。例如,字符串”BB””Aa”hashCode的结果相等,但equals的结果不相等。

2当一个对象被存储进HashSet集合中以后,就不能修改这个歌对象中的那些参与计算哈希值的字段,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前的引用作为参数区HsahSet集合中检索对象,也将返回找不到对象的结果,这也是导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。

例子:

package cn.zyj26.review;
 
public class ReflectPoint {
 
   private int x;
   public int y;
  
   public ReflectPoint(int x, int y) {
      super();
      this.x = x;
      this.y = y;
   }
   public int getX() {
      return x;
   }
 
 
   public void setX(int x) {
      this.x = x;
   }
 
 
   public int getY() {
      return y;
   }
 
 
   public void setY(int y) {
      this.y = y;
   }
   @Override
   public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + x;
      result = prime * result + y;
      return result;
   }
   @Override
   public boolean equals(Object obj) {
      if (this == obj)
         return true;
      if (obj == null)
         return false;
      if (getClass() != obj.getClass())
         return false;
      ReflectPoint other = (ReflectPoint) obj;
      if (x != other.x)
         return false;
      if (y != other.y)
         return false;
      return true;
   }
  
}
 

 

 

 

package cn.zyj26.review;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
 
 
public class ReflectTest2 {
 
   public static void main(String[] args) throws Exception{
      Collection<ReflectPoint> collections=new ArrayList<ReflectPoint>();
      ReflectPoint pt1 = new ReflectPoint(1,1);
      ReflectPoint pt2 = new ReflectPoint(2,2);
      ReflectPoint pt3 = new ReflectPoint(1,1);//默认的equals方法比较的是hashcoad值,所以pt3与pt1不相等,要相等必须重写equals方法
      collections.add(pt1);
      collections.add(pt2);
      collections.add(pt3);
      collections.add(pt1);
      System.out.println(collections.size());//4
      Collection<ReflectPoint> collectionsH=new HashSet<ReflectPoint>();
      collectionsH.add(pt1);
      collectionsH.add(pt2);
      collectionsH.add(pt3);
      collectionsH.add(pt1);//3,重写equals可以得到结果2
      System.out.println(collectionsH.contains(pt1));//true
      pt1.y=22;//导致哈希值改变了!!这样也无法删除了,即collectionsH.remove(pt1);无效了
      System.out.println(collectionsH.contains(pt1));//false
      System.out.println(collectionsH.size());
   }
}

 

 

 

Ps

解释equals()hashcode()== http://justsee.iteye.com/blog/1317565

分享到:
评论

相关推荐

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

    本篇将深入探讨ArrayList与HashSet的区别,并分析Hashcode在其中的作用。 ArrayList是基于动态数组实现的,它提供了按索引访问元素的能力,就像在数组中一样。由于内部维护了一个数组,ArrayList保证了元素的顺序性...

    java中Hashcode的作用.docx

    1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。 2. 如果两个对象根据equals(Object o)方法是相等的,...

    HashSet类的用法.pdf

    - 当`HashSet`中的元素为自定义类型时,必须正确地重写`equals()`和`hashCode()`方法以确保元素的唯一性和性能。 以上是对`HashSet`类的基本用法及特性的一个详细介绍。希望这些内容能帮助读者更好地理解和使用`...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...

    集合的概念及应用和HashSet保证数据不重复的原理

    同时,源码分析也能帮助我们理解HashMap的扩容机制,以及为什么即使两个对象的hashCode相同,它们仍然可以在HashSet中区分(因为equals()方法的正确实现)。 工具在学习和使用集合框架时也扮演着重要角色。例如,...

    java List去掉重复元素的几种方式(小结)

    _注意_:当数据元素是实体类时,需要额外重写_equals_()和_hashCode_()方法,以便正确地比较对象的相等性。例如,以学号为依据判断重复: ```java public class Student { String id; String name; int age; ...

    就业班JavaSE-day08每日作业卷1

    【栈和队列的特点】 ...由于HashSet不允许重复元素,所以重复的元素在添加过程中会被自动过滤掉,最后得到的HashSet中元素即为ArrayList去重后的结果。这个过程通常比直接在ArrayList中操作要高效。

    常见集合知识和面试题

    为了实现元素的唯一性,`HashSet`会调用元素的`hashCode()`和`equals()`方法来确定元素是否重复。因此,为了使`HashSet`正常工作,加入其中的对象必须正确实现这两个方法。 - **TreeSet**:实现了`SortedSet`接口,...

    第8天(集合【LinkedList、HashSet、Collection集合体系】)v201703103

    \n - **HashSet存储自定义元素**:HashSet可以存储任何类型的对象,包括自定义对象,但要求对象必须实现`hashCode()`和`equals()`方法,以便于计算哈希码并判断元素唯一性。\n\n4. **判断集合元素唯一性原理**\n 在...

    集合框架的各自区别.pdf

    在日常开发中,ArrayList、HashSet和HashMap是最常用的集合类型。ArrayList提供了快速的随机访问,适用于大部分情况;HashSet提供了快速查找和去重功能;HashMap则通过键的哈希值实现快速查找。在多线程环境下,需...

    Java集合容器面试题(2024最新版)-重点.docx

    - 集合框架包括了多个接口(如Collection、List、Set、Map)、类(如ArrayList、HashSet、HashMap)以及相关的算法。 2. **集合和数组的区别**: - 数组是固定大小的,存储同类型的元素,而集合的大小可变,可以...

    第8天(集合【LinkedList、HashSet、Collection集合体系】)v201703104

    在使用 HashSet 存储自定义元素时,必须确保类正确实现了 equals() 和 hashCode() 方法,因为这是判断元素唯一性的基础。如果类没有重写这两个方法,将使用默认的 Object 类的实现,可能导致无法正确区分不同对象,...

    超详细的Java面试题总结(三)之Java集合篇常见问题.docx

    HashSet通过比较元素的hashcode和equals()方法来检测重复项。HashMap则是一个存储键值对的结构,不保证顺序,允许键或值为null。 HashMap和ConcurrentHashMap的主要差异在于线程安全性和设计。ConcurrentHashMap...

    Core Java 简单谈谈HashSet(推荐)

    HashSet相比于其他集合类,如ArrayList或LinkedList,具有查找速度快的优点,因为它基于哈希表的数据结构,平均时间复杂度为O(1)。然而,它不保证元素的顺序,如果你需要保持元素插入的顺序,可以考虑使用...

    java中List对象列表实现去重或取出及排序的方法

    equals方法用于比较两个对象是否相同,而hashCode方法用于计算对象的哈希码值。 例如,假设我们有一个Student类,想要去重Student对象列表。首先,我们需要重写Student类的equals和hashCode方法。 ```java public ...

    03_ListAndSet_java_order64n_源码

    因此,为了使HashSet能正确工作,存储的元素必须正确实现hashCode()和equals()方法。 Java的HashMap是基于开放寻址法和链地址法的混合实现,它使用负载因子(默认为0.75)来决定何时进行扩容。当元素数量达到当前...

    《安全编程技术》教学大纲.docx

    3. **HashSet, ArrayList和HashCode原理分析**:本章深入讨论集合框架,理解`HashSet`和`ArrayList`的存储机制,以及`hashCode()`方法在对象存储和比较中的关键作用。 4. **内省和JavaBean原理分析**:内省是Java中...

    实验05 Java集合.doc

    为了使Person对象能在HashSet中正确工作,我们需要重写`hashCode()`和`equals()`方法,确保当两个Person对象的姓名和身份证号都相等时,它们被视为相等。然后,我们使用Iterator遍历HashSet并打印元素。 接着,我们...

    Java高新技术Java高新技术.doc

    6. **ArrayList与HashSet的比较**:`ArrayList`是有序且可重复的,它按照元素插入的顺序存储数据。而`HashSet`是无序且不可重复的。在插入元素时,`HashSet`会检查元素的`hashCode`,以确定其存储位置,从而快速查找...

Global site tag (gtag.js) - Google Analytics