`
sungang_1120
  • 浏览: 323873 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

JAVA 集合类ArrayList HashSet的比较 以及对Hashcode和 equals的分析 通过例子说明的

阅读更多
package com.sg.reflex;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

public class ReflexClassTest02 {
    public static void main(String[] args) {
        Collection collections = new HashSet();
        //Collection collections = new ArrayList();
        ReflecClassPoint rcp1 = new ReflecClassPoint(3, 3);
        ReflecClassPoint rcp2 = new ReflecClassPoint(5, 5);
        ReflecClassPoint rcp3 = new ReflecClassPoint(3, 3);
        //因为没有重写equals和hashCode方法  所以现在rcp1 和 rcp3不相等
        
        //把这些对象 放到集合中去
        collections.add(rcp1);
        collections.add(rcp2);
        collections.add(rcp3);
        collections.add(rcp1);
        
        //修改rcp1.y的值
        rcp1.y = 7;
        //删除这个对象
        collections.remove(rcp1);
        
        System.out.println(collections.size());      
    }
}

 

class ReflecClassPoint{
    private int x;
    public int y ;
    
    public ReflecClassPoint(int x, int y) {
        this.x = x;
        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;
        ReflecClassPoint other = (ReflecClassPoint) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return null;
    }

 
           
        //在这里因为没有重写equals和hashCode方法
       
       
       
        //ArrayList是有位置顺序的 可以重复的  所以结果长度是  4
        //HashSet是无位置顺序的 不可以重复的  所以结果长度是  3
       
        //如果重写equals和hashCode方法 之后 现在rcp1 和 rcp3相等
        //HashSet结果就是   2
       
        //针对Set集合来说
        //要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢
       
        //equals比较是两个对象的值是否相等 但是并没有比较hashCode的在内存中的
        //地址区域是否也是相等的
       
       
        //根据上述例子   如果你把hashCode的方法  去掉  HashSet 依然打印的长度还是  3
        //原因就是  没有去比较这两个对象在内存中的区域是否也是相同的
       
       
       
        //反之  如果你把equals方法  去点也是一个道理  就是说去过这两个对象equals
        //相等  你要去重写他们的hashCode方法  这样才能保证 两个对象是否是真的相等了
        //前提是你这个对象存到的是一个Hash集合里   否则 就没有必要比较他们的hash地址是否相等了
   
   
        //还有就是但一个对象被存在hashSet集合钟以后  就不能修改这个对象中那些参与计算的哈希
        //算法的字段了  否则,对象修改之后的哈希值与最初存储进hashSet集合中的哈希值就不同了
        //在这种情况下  即使你去删除这个对象时  也会删除不掉了 此时  他已经找不到这个对象了
        //这也会导致无法从hashSet集合中单独的删除当前的对象了  从而导致内存泄露
       
        //如果在重写了equals和hashCode方法 之后操作下面这些步骤的话:
        //比如上面的rcp1对象  在把他放进hashSet集合之后  你去修改他的参数值  时   然后  再去删除
        //remove这个rcp1对象  此时是删除不了的  此时通过HashSet集合的长度依然是 2
       
        //如果你去再放进hashSet集合后的rcp1对象   直接删除的话 
        //此时通过HashSet集合的长度依然 就是  1
       
        //如果通过上述这种情况操作的话  积累过多的话 可能会导致  内存泄漏的出现
        //所以  一个对象被存在hashSet集合钟以后  就不要修改这个对象中那些参与计算的哈希
        //算法的字段了

 

      以上仅是个人通过小程序  对上述情况的说明与分析

分享到:
评论

相关推荐

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

    在Java编程语言中,ArrayList和HashSet是两种常用的集合类,它们各自有其特性和应用场景。在实际开发中,理解它们的差异以及如何有效地利用它们是非常重要的。本篇将深入探讨ArrayList与HashSet的区别,并分析...

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

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

    对于java集合类的一个简单介绍

    HashSet存储的对象,需要重写hashCode()和equals()两个方法。 Iterator迭代器 Iterator是一种设计模式,提供了遍历集合的能力。Iterator提供了hasNext()和next()两个方法,分别用于检查是否有可迭代的元素和返回...

    Java集合类详解总结

    `Set`集合通过`equals()`方法和`hashCode()`方法确保元素的唯一性,因此向`Set`中添加元素时,元素类必须正确实现这两个方法。 #### Map的键值对映射 `Map`通过键(Key)来定位值(Value),键是唯一的。`HashMap`...

    java集合分类总结.doc

    HashSet是哈希表实现的,equals返回true,hashCode返回相同的整数。SortedSet是Set的子接口,对Set排序实现类是TreeSet,使用二叉树实现的。 Map集合是一种键值对集合,key不能重复,但是value可以重复。Map集合的...

    实验05 Java集合.doc

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,...总之,这个实验深入地实践了Java集合框架的使用,加深了对集合概念、接口和实现类的理解,为后续的Java开发打下了坚实的基础。

    java集合类

    Java集合类的设计使得开发者可以根据实际需求选择合适的数据结构,如需要有序的列表可以选择LinkedList或ArrayList,需要唯一元素的集合可以选择HashSet或TreeSet,需要键值对存储则有HashMap或TreeMap。理解并熟练...

    Java集合类面试题.docx

    它包括List(有序、可重复元素)、Set(无序、不允许重复元素)和Map(键值对)接口,以及它们的实现如ArrayList、HashSet、HashMap等。 2. **集合框架的优点?** - 提供了统一的API,简化了代码。 - 提高了性能...

    JAVA集合类.pdf

    行排序的呢?这主要依赖于对象的自然排序或者定制排序。 在Java中,对于实现...在处理数据时,应根据实际需求选择合适的集合类型,同时注意对象的equals()和hashCode()方法的一致性,以确保集合操作的正确性。

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

    此外,JDK提供的javadoc文档是获取集合类详细信息的重要资源,其中包含了类的说明、方法签名以及参数和返回值的解释。 总结来说,集合是Java编程的基础,理解其概念、应用和内部工作原理对于提高编程效率和编写高...

    java常用集合类总结

    Java中的集合类是编程中不可或缺的部分,它们提供了一种组织和管理对象的方式。在这个总结中,我们将深入探讨Java集合框架中的主要组件,包括ArrayList、LinkedList、HashSet、HashMap等,并了解如何进行基本操作如...

    java高级集合类

    ### Java高级集合类详解 #### 一、概述 在Java编程语言中,集合类框架(Collections Framework)提供了处理数据的强大工具。本篇文章将详细介绍三种主要的集合类型:`List`、`Set` 和 `Map` 的特性、区别及联系。 ...

    HashSet类的用法.pdf

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

    java集合课程3.docx

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了多种数据结构的实现,使得开发者能够高效地管理和操作数据。本课程主要涵盖了以下几个核心知识点: 1. **集合框架图**: - Java集合框架分为两大类...

    Java集合排序及java集合类详解(Collection、List、Map、Set

    Java集合排序及java集合类详解 Java集合框架是Java编程语言中极其重要的一部分,它提供了存储和操作数据的高效方式。本文将深入探讨Java集合框架的四大核心组件:`Collection`、`List`、`Map`和`Set`,以及它们的...

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

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

    java中常用集合类和接口.doc

    ### Java中常用集合类和接口详解 #### 一、引言 在Java编程中,集合类(Collections)是非常重要的组成部分,它们提供了灵活的数据管理和组织方式。本文将详细介绍Java中的主要集合类及其接口,帮助读者更好地理解...

    java 集合和数组的详细总结(并随着讲解带9个例子)

    6. **集合的比较**:使用equals()和hashCode()方法比较集合内容。 7. **集合的迭代**:使用Iterator迭代器遍历集合。 8. **集合的并发操作**:在多线程环境中,使用ConcurrentHashMap等并发安全的集合。 9. **集合的...

Global site tag (gtag.js) - Google Analytics