/*
2008年8月22日17:10:04
一个有关equals()的问题
*/import java.util.*;class Compare
{
public static void main(String[] args)
{
int []ia = {1,2,3,4};
int []ib = {1,2,3,4}; if (Arrays.equals(ia, ib)) // 请问为什么将Arrays.equals(ia, ib)改为ia.equals(ib) 编译没错误,但运行结果却什么都没有输出呢? 或者说为什么ia.equals(ib)返回false呢?请诸位指教
{
System.out.println("equals -> " + "ia == ib");
}
}
}
/*
在JDK 1.6中的运行结果是:
---------------
equals -> ia == ib
---------------
*/
2008年8月22日17:10:04
一个有关equals()的问题
*/import java.util.*;class Compare
{
public static void main(String[] args)
{
int []ia = {1,2,3,4};
int []ib = {1,2,3,4}; if (Arrays.equals(ia, ib)) // 请问为什么将Arrays.equals(ia, ib)改为ia.equals(ib) 编译没错误,但运行结果却什么都没有输出呢? 或者说为什么ia.equals(ib)返回false呢?请诸位指教
{
System.out.println("equals -> " + "ia == ib");
}
}
}
/*
在JDK 1.6中的运行结果是:
---------------
equals -> ia == ib
---------------
*/
但是ia.equals(ib)还比较了这两个数组的内存地址 那当然不一样了 所以就返回了false
Arrays.equals(int[] a, int[] b)里面定义了equals比较的算法
a.equals(b) 这里调用equals实际上是直接调用到了Object的equals方法。而Object的equals的实现是比较两个对象的引用什么相等,所以这里是返回false.
如果你要用a.equals(b)也可以,你最好自己定义一个class.例如
class a{
private int[] arr;
a(int[] arr) {
this.arr = arr;
}
public int[] getArr() {
return arr;
}
public boolean equals(Object b) {
if (b instanceof a) {
if (b.getArr().length != a.getArr().length) return false;
for (int i = 0; i < a.getArr().length; ++i) {
if (!a.getArr()[i].equals(b.getArr()[i])) return false;
}
return true;
}
return false;
}
}
其次这个问题的ia.equals(ib)。 如果想返回true则必须像5楼那样重写equals方法,否则比较的仅仅是父类Object类的equals(默认楼主了解继承了),而父类的equals比较的仅仅是2个引用是否相同,也就是说ia和ib是否指向相同的对象?那2个的new,动态地址分配的肯定不同,引用指向也必然不同。所以返回false.
Arrays.equals比较的则是被重载过的Arrays类的equals方法,由于是静态的所以可以直接Arrays.equals,这个方法比较的正如4楼所说的。
但是ia.equals(ib)还比较了这两个数组的内存地址 那当然不一样了 所以就返回了false