热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

当我向javaHashSet添加元素时,所有元素都会发生变化

如何解决《当我向javaHashSet添加元素时,所有元素都会发生变化》经验,为你挑选了1个好方法。

在康威的生命游戏模拟器中,我有八个代码块,看起来像这样找到一个单元格的邻域.

int count = 0;
    p.setLocation(p.x-1, p.y-1); //upper left
    if( data.contains(p) ) ++count;
    else if( addingDeadCells ) {
        deadCellsToCheck.add(p);
        for( Point z : deadCellsToCheck ) 
            System.out.println(z.toString() + " " + z.hashCode()); 
        System.out.println();
    }

p是表示当前单元格的点,data是包含活动单元格的HashSet.为了提高效率,我只检查与活细胞相邻的死细胞,因此deadCellsToCheck是另一个HashSet,它将每一代开始为空.每次执行deadCellsToCheck.add(p)时,似乎已经在其中的所有单元都被覆盖为刚添加的单元,因为输出如下所示:

java.awt.Point[x=0,y=0] 0

java.awt.Point[x=1,y=0] 1072693248
java.awt.Point[x=1,y=0] 1072693248

java.awt.Point[x=2,y=0] 1073741824
java.awt.Point[x=2,y=0] 1073741824
java.awt.Point[x=2,y=0] 1073741824
etc...

我不认为这可能有多种原因.有任何想法吗?



1> Jaroslaw Paw..:

出现此问题的原因是您HashSet包含Point多次相同的实例.p.setLocation(p.x-1, p.y-1);您应该创建一个新点并将其添加到集合中,而不是编辑点:

int count = 0;
p = new Point(p.x-1, p.y-1); // new point here
if (data.contains(p)) {
     count++;
} else if (addingDeadCells) {
    deadCellsToCheck.add(p);
    for (Point z : deadCellsToCheck)  {
        System.out.println(z.toString() + " " + z.hashCode());
    }
    System.out.println();
}

您当前的结构也违反了hashCode()方法合同:

每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数

hashCodeequals方法使用的一套以消除重复.你创造了(0,0)具有的点hashcode = 0.然后将点修改为(1,0),其haschode更改为,1072693248因此set允许再次插入此点.但它是相同的实例 - 它是在集合中插入两次的相同对象.

可变对象通常不应该依赖于hashcode方法的集合或其他数据结构.

解决方案是使点不可变(如果你使用java.awt.Point,我建议你创建自己的类):

public class Point {

     private final int x;
     private final int y;

     public Point(int x, int y) {
         this.x = x;
         this.y = y;
     }

     // hashcode and equals methods
     // getters and utility methods

}


推荐阅读
  • 这篇文章运用简单易懂的例子给大家介绍JAVAHashSet和TreeSet实现保证存入元素不会重复,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 如何解决《HashSetremoveAll方法非常慢》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《hashSet中的重复值》经验,为你挑选了1个好方法。 ... [详细]
  • Java中HashSet的实现原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • Java:HashSet与HashMap
    如何解决《Java:HashSet与HashMap》经验,为你挑选了2个好方法。 ... [详细]
  • 如何解决《javaHashSet中的重复项》经验,为你挑选了1个好方法。 ... [详细]
  • HashSet and HashMap
    HashSetandHashMap总体介绍之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashS ... [详细]
  • 如何解决《如何以最有效的方式迭代和删除hashset中的元素》经验,为你挑选了1个好方法。 ... [详细]
author-avatar
忧伤丿稻草展
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有