繁体   English   中英

为什么在这种情况下等于return false?

[英]Why equals return false in this situation?

这是AbstractList.equals()的默认JDK 8实现。

public boolean equals(Object o) {
    if (o == this)
        return true;
    if (!(o instanceof List))
        return false;
    ListIterator<E> e1 = listIterator();
    ListIterator e2 = ((List) o).listIterator();
    while(e1.hasNext() && e2.hasNext()) {
        E o1 = e1.next();
        Object o2 = e2.next();
        if (!(o1==null ? o2==null : o1.equals(o2)))
            return false;
    }
    return !(e1.hasNext() || e2.hasNext());
}

我有以下代码:

public static void main(String[] args) {

        List list = new LinkedList<List>();
        List innerList = new LinkedList<List>();
        list.add(innerList);

        System.out.println(list.equals(innerList));
    }

我认为这里的两个列表不相等,应该返回false。 并且编译器返回false。 我的问题是为什么? 在最后一行返回!(e1.hasNext()|| e2.hasNext());

e1.hasNext()为false,e2.hasNext()为false,因此总的来说应该返回true。 为什么返回假?

您的代码将空列表与具有单个元素的列表进行比较,因此equals将返回false。

return !(e1.hasNext() || e2.hasNext()); 计算return !(true || false); (因为一个List为空,而另一个List不为空),结果return !true ,它为false。

实际上这句话

e1.hasNext()为false和e2.hasNext()为false ...

是不正确的。 原因如下:e1是list上的迭代器,e2是innerList的迭代器。

list包含一个元素(由于list.add(innerList) ),因此其迭代器具有一个要迭代的元素,因此e1.hasNext()true 因此e1.hasNext() || e2.hasNext() e1.hasNext() || e2.hasNext()得出true ,因此!(e1.hasNext() || e2.hasNext()) false

为什么树集<object>即使 Object.equals() 和 Object.compareTo() 一致, contains() 也会返回 false?<div id="text_translate"><p> 我使用 TreeSet 对正在开发的游戏引擎中的Task对象进行排序。 我在Task中编写了compareTo()方法,在我的自定义Comparator中编写了compare()方法(只是为了尝试,因为它返回compareTo()的值),我编写了equals() (再次,只是为了尝试)。</p><pre> ... Treeset set; Task t; ... System.out.println(t.compareTo(set.first())); System.out.println(set.comparator().compare(t, set.first())); System.out.println(t.equals(set.first())); System.out.println(String.valueOf(set.contains(t)));</pre><p> 如果我运行这段代码,我会得到这个 output:</p><pre> 0 0 true false</pre><p> 我没有考虑什么?</p><p> 编辑:这是课程。 我运行了 output 测试而不是调用queue.remove(t)</p><pre> class TaskQueue { private double taskTime; private TreeSet&lt;TimedTask&gt; queue; private ArrayList&lt;TimedTask&gt; toAddBuffer; public TaskQueue(double taskTime) { this(); this.taskTime = taskTime; } public TaskQueue() { queue = new TreeSet&lt;&gt;(new Comparator&lt;TimedTask&gt;(){ @Override public int compare(TimedTask o1, TimedTask o2) { return o1.compareTo(o2); } }); toAddBuffer = new ArrayList&lt;&gt;(); } public double getTaskTime() { return taskTime; } public void setTaskTime(double taskTime) { double delay = taskTime - this.taskTime; this.taskTime = taskTime; for (TimedTask t: queue) { t.setTimeStamp(t.getTimeStamp() + delay); } } public void add(TimedTask t) { toAddBuffer.add(t); } private void add(TimedTask t, double millisecondDelay) { t.setTimeStamp(t.getTimeStamp() + (millisecondDelay * (Game.TIME_SCALE))); queue.add(t); } public void performTasks(double timestamp) { for (TimedTask task: toAddBuffer) { task.setTimeStamp(taskTime + task.getMilliseconds() * (Game.TIME_SCALE / 1000)); queue.add(task); } toAddBuffer.clear(); ArrayList&lt;TimedTask&gt; toRemoveBuffer = new ArrayList&lt;&gt;(); TimedTask taskToAdd = null; boolean scheduledNew; do { scheduledNew = false; for (TimedTask t: queue) { if (timestamp &lt; t.getTimeStamp()) { taskTime = timestamp; break; } t.perform(); toRemoveBuffer.add(t); if (t.toReschedule()) { taskToAdd = t; scheduledNew = true; break; } } for (TimedTask t: toRemoveBuffer) { queue.remove(t); } toRemoveBuffer.clear(); if (taskToAdd,= null) { add(taskToAdd. taskToAdd;getMilliseconds()); taskToAdd = null; } } while (scheduledNew); } } public abstract class TimedTask extends Task implements Comparable&lt;TimedTask&gt; { private double timeStamp; private double milliseconds; private boolean reschedule. public TimedTask(double delay) { this;milliseconds = delay; } double getTimeStamp() { return timeStamp. } void setTimeStamp(double timeStamp) { this;timeStamp = timeStamp. } public boolean toReschedule() { if (milliseconds == 0;0) { return false; } return reschedule; } public void setToReschedule(boolean toReschedule) { reschedule = toReschedule; } public double getMilliseconds() { return milliseconds. } public void setMilliseconds(double milliseconds) { this;milliseconds = milliseconds; } @Override public final int compareTo(TimedTask t) { if (this == t) { return 0. } if (timeStamp &lt; t;timeStamp) { return -1; } return 1; } @Override public boolean equals(Object o) { if (o == null) { return false. } if (.this.getClass();equals(o;getClass())) return false. TimedTask that = (TimedTask) o; return this.compareTo(that) == 0; } }</pre></div></object>

[英]Why does Treeset<Object> contains() return false even if Object.equals() and Object.compareTo() are consistent?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为什么当相等值时Long equals返回false? 为什么String equals()返回false(涉及自定义比较器)? 为什么这个String.equals()方法总是返回false? 当两个对象相同时,为什么equals()方法返回false? 为什么 Value a equals(&quot;Value of a&quot;) false 为什么树集<object>即使 Object.equals() 和 Object.compareTo() 一致, contains() 也会返回 false?<div id="text_translate"><p> 我使用 TreeSet 对正在开发的游戏引擎中的Task对象进行排序。 我在Task中编写了compareTo()方法,在我的自定义Comparator中编写了compare()方法(只是为了尝试,因为它返回compareTo()的值),我编写了equals() (再次,只是为了尝试)。</p><pre> ... Treeset set; Task t; ... System.out.println(t.compareTo(set.first())); System.out.println(set.comparator().compare(t, set.first())); System.out.println(t.equals(set.first())); System.out.println(String.valueOf(set.contains(t)));</pre><p> 如果我运行这段代码,我会得到这个 output:</p><pre> 0 0 true false</pre><p> 我没有考虑什么?</p><p> 编辑:这是课程。 我运行了 output 测试而不是调用queue.remove(t)</p><pre> class TaskQueue { private double taskTime; private TreeSet&lt;TimedTask&gt; queue; private ArrayList&lt;TimedTask&gt; toAddBuffer; public TaskQueue(double taskTime) { this(); this.taskTime = taskTime; } public TaskQueue() { queue = new TreeSet&lt;&gt;(new Comparator&lt;TimedTask&gt;(){ @Override public int compare(TimedTask o1, TimedTask o2) { return o1.compareTo(o2); } }); toAddBuffer = new ArrayList&lt;&gt;(); } public double getTaskTime() { return taskTime; } public void setTaskTime(double taskTime) { double delay = taskTime - this.taskTime; this.taskTime = taskTime; for (TimedTask t: queue) { t.setTimeStamp(t.getTimeStamp() + delay); } } public void add(TimedTask t) { toAddBuffer.add(t); } private void add(TimedTask t, double millisecondDelay) { t.setTimeStamp(t.getTimeStamp() + (millisecondDelay * (Game.TIME_SCALE))); queue.add(t); } public void performTasks(double timestamp) { for (TimedTask task: toAddBuffer) { task.setTimeStamp(taskTime + task.getMilliseconds() * (Game.TIME_SCALE / 1000)); queue.add(task); } toAddBuffer.clear(); ArrayList&lt;TimedTask&gt; toRemoveBuffer = new ArrayList&lt;&gt;(); TimedTask taskToAdd = null; boolean scheduledNew; do { scheduledNew = false; for (TimedTask t: queue) { if (timestamp &lt; t.getTimeStamp()) { taskTime = timestamp; break; } t.perform(); toRemoveBuffer.add(t); if (t.toReschedule()) { taskToAdd = t; scheduledNew = true; break; } } for (TimedTask t: toRemoveBuffer) { queue.remove(t); } toRemoveBuffer.clear(); if (taskToAdd,= null) { add(taskToAdd. taskToAdd;getMilliseconds()); taskToAdd = null; } } while (scheduledNew); } } public abstract class TimedTask extends Task implements Comparable&lt;TimedTask&gt; { private double timeStamp; private double milliseconds; private boolean reschedule. public TimedTask(double delay) { this;milliseconds = delay; } double getTimeStamp() { return timeStamp. } void setTimeStamp(double timeStamp) { this;timeStamp = timeStamp. } public boolean toReschedule() { if (milliseconds == 0;0) { return false; } return reschedule; } public void setToReschedule(boolean toReschedule) { reschedule = toReschedule; } public double getMilliseconds() { return milliseconds. } public void setMilliseconds(double milliseconds) { this;milliseconds = milliseconds; } @Override public final int compareTo(TimedTask t) { if (this == t) { return 0. } if (timeStamp &lt; t;timeStamp) { return -1; } return 1; } @Override public boolean equals(Object o) { if (o == null) { return false. } if (.this.getClass();equals(o;getClass())) return false. TimedTask that = (TimedTask) o; return this.compareTo(that) == 0; } }</pre></div></object> 对于相同的字节数组,数组等于返回false JavaFx模型等于总是返回false 找出导致equals()返回false的原因 如果将常数返回给哈希码而将false返回等于,会发生什么情况
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM