为什么输出都是false?

2025-05-13 18:00:07
推荐回答(4个)
回答(1):

前面几位说的基本都是正确的,我再仔细剖析一下。LZ这么进行数组的比较,肯定是受到了String类的影响,比如:
String s1 = "a";
String s2 = "a";
System.out.println(s1.equals(s2));
这里的结果是true。但是需要注意的是,s1与s2是两个不同的对象,他们引用了不同的内存地址。Object类的equals方法默认的就是比"=="(未被重写过的equals方法同"=="),也就是说比的是他们是否是同一个对象。但是为什么会输出true呢?
1.String类重写了equals方法,它的对象比较的时候会去比值,而不是地址,就像基本数据类型那样。
2.当输出s1和s2的hashCode()时,会发现也是相等的,内存地址也相同吗?好吧,其实String类又改写了hashCode方法(见api,equals方法被重写时,通常有必要重写 hashCode 方法)。
以上两点,使String类的对象操作起来与基本数据类型比较相似,但是本质上是大相径庭的。
回到LZ的问题,按照上面String类的特性去考虑数组,可能就是问题的所在吧。这里我们把数组考虑成一个类,然后他们的两个值相等的对象,进行equals的时候,会使用内存地址进行比较,显然结果会是false,他们是两个不同的对象,即使他们的值是相同的。
ps.1.未被重写的hashCode方法返回的是jvm内存地址的值而并非实际的物理内存地址。2.数组类与普通的java类是有区别的,数组有它的特殊性,这里不做赘述,请自行查阅相关资料。
要想比较这两个数组的值是否相等的话,就想1L说的那样,做个循环,逐一比较就可以了。

回答(2):

System.out.print((str1.equals(str))?"ture":"false");
System.out.print((str1==str)?"ture":"false");
str与str1是数组,是两个不同对象,所以equals肯定是false,那么==更是false了
两个数组变量引用同一个数组时,==才会返回true

回答(3):

要比较两个数组中的内容是否相同,没有这么比较的。
如果要比较对应位置的值是否相同,只能循环来逐个比较的。

回答(4):

str1和str两个数组,引用地址不同,值也不同,输出当然是false了。