当前位置: 首页 > 面试题库 >

HashSet的“ add”方法何时调用等于?]

许波涛
2023-03-14
问题内容

我在HashSet比较中进行了此测试,但equals 并未被调用

当farAway = false时我想考虑等于(检查两个点距离的函数)

完整的可编译代码,您可以对其进行测试,并说明为什么在此示例中未调用equals。

public class TestClass{
     static class Posicion
    {
        private int x;
        private int y;

        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Posicion other = (Posicion) obj;
            if ( farAway(this.x, other.x, this.y, other.y,5)){   
                return false;
            } 
            return true;
        }

        @Override
        public int hashCode() {
            int hash = 7; hash = 59 * hash + this.x; hash = 59 * hash + this.y;
            return hash;
        }

         Posicion(int x0, int y0) {
            x=x0;
            y=y0;
        }

        private boolean farAway(int x, int x0, int y, int y0, int i) {
            return false;
        }
    }

    public static void main(String[] args) {
        HashSet<Posicion> test=new HashSet<>();
        System.out.println("result:"+test.add(new Posicion(1,1)));
        System.out.println("result:"+test.add(new Posicion(1,2)));
    }
}

编辑

-是否有一种方法可以强制HashSet添加到调用等于?


问题答案:

如果哈希码不同,则无需调用,equals()因为可以保证可以返回false

在此之前,从一般的合同上equals()hashCode()

如果根据该equals(Object)方法两个对象相等,则hashCode在两个对象中的每个对象上调用该方法必须产生相同的整数结果。

现在,您的班级正在违反这份合同。您需要解决此问题。



 类似资料:
  • 问题内容: 我在一个教程中找到了这个示例。 当我运行此程序时,我的hs.size()值为2 ..,并且equals方法仅被调用一次。有人解释了我何时在HashSet中调用equal()方法 当上述程序中的equal方法调用时 问题答案: 您的代码将调用的唯一一次。另一次调用方法将是对的类。 此答案说明何时由和何时调用方法。摘录: HashSet利用哈希码来加快处理速度。假定彼此相等的两个对象将具有

  • 本文向大家介绍Java HashSet add()方法与示例,包括了Java HashSet add()方法与示例的使用技巧和注意事项,需要的朋友参考一下 HashSet类方法 add()方法在java.util包中可用。 当尚不存在给定元素时,使用add()方法将其插入此HashSet中,否则它将忽略它并返回false。 add()方法是一种非静态方法,只能通过类对象访问,如果尝试使用类名称访问

  • 假设客户端通过表单把新建用户的属性都发送过来了, 那么在UserModule中就建一个add方法如下 @At public Object add(@Param("..")User user) { NutMap re = new NutMap(); String msg = checkUser(user, true); if (msg

  • 全部显示 Add 方法应用于 NewFile 对象的情形。 在“新建项”任务窗格中添加新增项。返回 Boolean 类型。如果项添加成功,则返回 True。 expression.Add(FileName, Section, DisplayName, Action) expression 必需。该表达式返回上面对象之一。 FileNameString 类型,必需。添加到任务窗格中文件列表的文件名称

  • 问题内容: 我执行了以下代码,发现输出为。 我想知道它的行为以及为什么输出是。 问题答案: 您还需要覆盖方法。这两种方法都用于适当的功能,因此必须被覆盖在 用户定义的类 ,如果你制作的作为,其他的类习惯并没有两个不同的可被视为与它们的将永远是不同的,并且肯定会在情况下总是返回。

  • 对于Java中的ArrayBlockingQueue,does queue。添加(元素)是否锁定了它所在的线程?我有一个运行着数十个线程的应用程序,这些线程将所有信息放入一个ArrayBlockingQueue。线程无法承受任何短时间的锁定。如果他们都在将对象放入队列中,add方法会立即继续,让队列在将来将对象放入自己的队列中,还是等到对象实际放入队列中?