我在互联网上看到了以下程序
public class Test1{
public static void main(String[] args)
{
Integer int1 = new Integer(10);
Vector vec1 = new Vector();
LinkedList list = new LinkedList();
vec1.add(int1);
list.add(int1);
if(vec1.equals(list)) System.out.println("equal");
else System.out.println("not equal");
}
}
它打印的答案是“平等的”。
怎么可能?
由于
迪利普
答案 0 :(得分:8)
因为LinkedList和Vector都实现了List#equals()
当且仅当指定的对象也是列表时才返回true 列表具有相同的大小,以及所有相应的元素对 这两个名单是平等的。 (如果,两个元素e1和e2相等 (e1 == null?e2 == null:e1.equals(e2))。)换句话说,两个列表是 如果它们包含相同的元素,则定义为相等 订购。此定义确保equals方法正常工作 跨越List接口的不同实现。
具体来说,这是此行为的确切原因。
此定义确保equals方法在List接口的不同实现中正常工作。
答案 1 :(得分:4)
以下是Vector.equals()
的API文档(其他List
实现的行为类似):
将指定的Object与此Vector进行比较以获得相等性。返回 当且仅当指定的Object也是List时,才为true,两个列表都为true 具有相同的大小,以及两者中所有相应的元素对 列表是平等的。
答案 2 :(得分:2)
在java.util.Vector上查看javadoc for equals:
/**
* Compares the specified Object with this Vector for equality. Returns
* true if and only if the specified Object is also a List, both Lists
* have the same size, and all corresponding pairs of elements in the two
* Lists are <em>equal</em>. (Two elements {@code e1} and
* {@code e2} are <em>equal</em> if {@code (e1==null ? e2==null :
* e1.equals(e2))}.) In other words, two Lists are defined to be
* equal if they contain the same elements in the same order.
*
* @param o the Object to be compared for equality with this Vector
* @return true if the specified Object is equal to this Vector
*/
equals方法检查列表是否以相同的顺序具有相同的内容。
答案 3 :(得分:0)
http://download.oracle.com/javase/1.4.2/docs/api/java/util/Vector.html#equals%28java.lang.Object%29
equals
上Vector
实施的定义:
将指定的Object与此Vector进行比较以获得相等性。当且仅当指定的Object也是List时,返回true,两个列表具有相同的大小,并且两个列表中的所有对应元素对都相等。 (如果(e1 == null?e2 == null:e1.equals(e2)),则两个元素e1和e2相等。)换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等。
Vector
和LinkedList
都是AbstractList的后代(在LinkedList
的情况下,我相信会有一个额外的类)。 AbstractList
个对象可以相互比较。
答案 4 :(得分:0)
答案 5 :(得分:0)
这是因为LinkedList和Vector在内部调用相同的方法java.util.AbstractList.equals()来进行比较。