Java 测试等于法

Java 测试等于法,java,Java,我有一个奇怪的问题,我无法理解为什么会发生这种情况 我在DoublyLinkedList泛型类中实现了这个equals方法: @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (getClass() != obj.getClass() || obj == null) { retu

我有一个奇怪的问题,我无法理解为什么会发生这种情况

我在
DoublyLinkedList
泛型类中实现了这个
equals
方法:

@Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (getClass() != obj.getClass() || obj == null) {
            return false;
        }

        DoublyLinkedList<E> other = (DoublyLinkedList<E>) obj;

        if (this.size != other.size) {
            return false;
        }

        Iterator<E> iterator = this.iterator();
        Iterator<E> otherIterator = other.iterator();
        while(iterator.hasNext()){       
            if(iterator.next() != otherIterator.next()){
                return false;
            }
        }
        return true;
    }
@覆盖
公共布尔等于(对象obj){
if(this==obj){
返回true;
}
如果(getClass()!=obj.getClass()| | obj==null){
返回false;
}
双链接列表其他=(双链接列表)对象;
if(this.size!=其他.size){
返回false;
}
迭代器迭代器=this.Iterator();
迭代器otherIterator=other.Iterator();
while(iterator.hasNext()){
if(iterator.next()!=otherIterator.next()){
返回false;
}
}
返回true;
}
在单元测试中测试此方法,如下所示:

@Test
public void testEquals() {
    System.out.println("equals");
    DoublyLinkedList <String> instance1 = new DoublyLinkedList <>(), instance2 = new DoublyLinkedList <>();

    instance1.addLast("Xpto");
    instance1.addLast("Ypto");
    instance1.addLast("Zpto");

    instance2.addLast("Xpto");
    assertFalse("Lists should not be equal", (instance1.equals(instance2)));
    assertFalse("Lists should not be equal", (instance2.equals(instance1)));        
    instance2.addLast("Ypto");
    assertFalse("Lists should not be equal", (instance1.equals(instance2)));
    assertFalse("Lists should not be equal", (instance2.equals(instance1)));
    instance2.addLast("Zpto");
    assertTrue("Lists should be equal", (instance1.equals(instance2)));
    assertTrue("Lists should be equal", (instance2.equals(instance1)));       
}
@测试
公开考试资格(){
System.out.println(“等于”);
DoublyLinkedList instance1=新的DoublyLinkedList(),instance2=新的DoublyLinkedList();
实例1.addLast(“Xpto”);
实例1.addLast(“Ypto”);
实例1.addLast(“Zpto”);
实例2.addLast(“Xpto”);
assertFalse(“列表不应相等”,(instance1.equals(instance2));
assertFalse(“列表不应相等”,(instance2.equals(instance1));
实例2.addLast(“Ypto”);
assertFalse(“列表不应相等”,(instance1.equals(instance2));
assertFalse(“列表不应相等”,(instance2.equals(instance1));
实例2.addLast(“Zpto”);
assertTrue(“列表应相等”,(instance1.equals(instance2));
assertTrue(“列表应相等”,(instance2.equals(instance1));
}
告诉我考试通过了。但是,如果我使用的是
,为什么会发生这种情况呢=
,而不是
等于
,以比较第一个代码中每个迭代器的实例?它不应该比较参考文献,从而失败吗


提前谢谢

这是因为它们指向内存中的同一位置

请参阅:

Java正在为您保留(或缓存)某些引用。具体地说,如果您输入
String
s作为您的类型,您将遇到一些奇怪的字符串插入行为,突然之间,您的列表具有相同的
String
引用。这是唯一一种
=
对引用有效的方法-如果它以某种方式被托管或缓存并且可以被引用

这是微不足道的失败;如果您使用的值不能被存储或缓存,那么您将发现测试失败


例如,
new BigInteger(“100”)
new BigInteger(“100”)
在内存中不是同一个位置,如果您将它们都放在列表中并尝试比较等价性,您将得到
false

您正在将
String
文本添加到列表中。
String
类采用快捷方式,并且有两个相同的字符串指向相同的内存地址,因此
==
=工作阅读此答案的最后一部分:Java中的字符串文本是interned。这在JLS(Java语言规范)中定义。