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是两种常用的集合类,它们各自有其特性和应用场景。在实际开发中,理解它们的差异以及如何有效地利用它们是非常重要的。本篇将深入探讨ArrayList与HashSet的区别,并分析...
Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...
HashSet存储的对象,需要重写hashCode()和equals()两个方法。 Iterator迭代器 Iterator是一种设计模式,提供了遍历集合的能力。Iterator提供了hasNext()和next()两个方法,分别用于检查是否有可迭代的元素和返回...
`Set`集合通过`equals()`方法和`hashCode()`方法确保元素的唯一性,因此向`Set`中添加元素时,元素类必须正确实现这两个方法。 #### Map的键值对映射 `Map`通过键(Key)来定位值(Value),键是唯一的。`HashMap`...
HashSet是哈希表实现的,equals返回true,hashCode返回相同的整数。SortedSet是Set的子接口,对Set排序实现类是TreeSet,使用二叉树实现的。 Map集合是一种键值对集合,key不能重复,但是value可以重复。Map集合的...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,...总之,这个实验深入地实践了Java集合框架的使用,加深了对集合概念、接口和实现类的理解,为后续的Java开发打下了坚实的基础。
Java集合类的设计使得开发者可以根据实际需求选择合适的数据结构,如需要有序的列表可以选择LinkedList或ArrayList,需要唯一元素的集合可以选择HashSet或TreeSet,需要键值对存储则有HashMap或TreeMap。理解并熟练...
它包括List(有序、可重复元素)、Set(无序、不允许重复元素)和Map(键值对)接口,以及它们的实现如ArrayList、HashSet、HashMap等。 2. **集合框架的优点?** - 提供了统一的API,简化了代码。 - 提高了性能...
行排序的呢?这主要依赖于对象的自然排序或者定制排序。 在Java中,对于实现...在处理数据时,应根据实际需求选择合适的集合类型,同时注意对象的equals()和hashCode()方法的一致性,以确保集合操作的正确性。
此外,JDK提供的javadoc文档是获取集合类详细信息的重要资源,其中包含了类的说明、方法签名以及参数和返回值的解释。 总结来说,集合是Java编程的基础,理解其概念、应用和内部工作原理对于提高编程效率和编写高...
Java中的集合类是编程中不可或缺的部分,它们提供了一种组织和管理对象的方式。在这个总结中,我们将深入探讨Java集合框架中的主要组件,包括ArrayList、LinkedList、HashSet、HashMap等,并了解如何进行基本操作如...
### Java高级集合类详解 #### 一、概述 在Java编程语言中,集合类框架(Collections Framework)提供了处理数据的强大工具。本篇文章将详细介绍三种主要的集合类型:`List`、`Set` 和 `Map` 的特性、区别及联系。 ...
- 当`HashSet`中的元素为自定义类型时,必须正确地重写`equals()`和`hashCode()`方法以确保元素的唯一性和性能。 以上是对`HashSet`类的基本用法及特性的一个详细介绍。希望这些内容能帮助读者更好地理解和使用`...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了多种数据结构的实现,使得开发者能够高效地管理和操作数据。本课程主要涵盖了以下几个核心知识点: 1. **集合框架图**: - Java集合框架分为两大类...
Java集合排序及java集合类详解 Java集合框架是Java编程语言中极其重要的一部分,它提供了存储和操作数据的高效方式。本文将深入探讨Java集合框架的四大核心组件:`Collection`、`List`、`Map`和`Set`,以及它们的...
HashSet通过比较元素的hashcode和equals()方法来检测重复项。HashMap则是一个存储键值对的结构,不保证顺序,允许键或值为null。 HashMap和ConcurrentHashMap的主要差异在于线程安全性和设计。ConcurrentHashMap...
### Java中常用集合类和接口详解 #### 一、引言 在Java编程中,集合类(Collections)是非常重要的组成部分,它们提供了灵活的数据管理和组织方式。本文将详细介绍Java中的主要集合类及其接口,帮助读者更好地理解...
6. **集合的比较**:使用equals()和hashCode()方法比较集合内容。 7. **集合的迭代**:使用Iterator迭代器遍历集合。 8. **集合的并发操作**:在多线程环境中,使用ConcurrentHashMap等并发安全的集合。 9. **集合的...