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语言规范)中定义。