首先说结论
- 在String类型中,==是比较地址,即“即使内容相同,地址不同会输出false。”
- 在在String类型中,equals()比较的是对象,即“只要内容相同,输出true。”
- 在数组类型中,equals()的作用等同于“==”,即“比较的是地址”
- 在数组类型中,只比较内容相同,应用数组中的Arrays.equals(a,b) 方法。换句话说,只要两个数组元素的顺序和内容都相同,则输出true。
个人认为这是因为在Java中,String本身是继承了Object父类,并将equals()方法进行重写,使得equals()方法只比较数值而非地址。(可以查看源代码)
然而,在重写之前,在Object中equals()本身的作用和“==”相同。在Array类中,未对equals重写,因此是直接继承了Object类的方法,因此在Array中,equals的方法和 = = 方法相同,都是比较地址。
——2023.5.30
原因
有一种说法是“数组不实现equals,它将方法移交给object……”
不过我认为这并没有解释清楚,即使交给了object,一样是比较对象啊,跟地址有啥关系。就算是string类型数据也是要交给object去实现equals()方法的。
参考链接
另一个说法
即“== 比较内存地址是否相同,equals 是针对引用数据类型的方法,取出内存地址中的值比较是否相同。”
Java中的八大基本类型
1.整型
1.1 字节型(byte)
1.2 短整型(short)
1.3 整型(int) (默认)
1.4 长整型(long)
2.浮点型
2.1 单精度浮点型(float)
2.2 双精度浮点型(double)(默认)
3.字符型
3.1 字符型(char)
4.布尔型
4.1 布尔类型(boolean)
引用类型:
1.类(class)
2.接口(interface)
3.数组([])
因此对于引用数据类型——数组,有一个专门的方法—— ** Arrays.equals(a,b) ** 对数组进行顺序、内容的比较,该方法不比较内存地址,只要顺序、内容相同,则输出ture。
问题起因
只是关注结论的不必往下看了,这部分是给自己记录的。
碰到了这样一道算法题:需要对两个字符串进行字母异位词判定。解题思路为:先对两个字符串进行排序,然后再将比较两个字符串的内容,若相等,则输出true。
String s =“anagram”;
String t =“nagaram”;
class Solution {
public static boolean isAnagram(String s, String t) {
char[] ch1,ch2;
boolean bo;
if (s.length()!=t.length()) {
return false;
}
ch1 = s.toCharArray();
ch2 = t.toCharArray();
Arrays.sort(ch1);
Arrays.sort(ch2);
//这里我最开始是用ch1.equals(ch2);输出false
//因为用该方法则比较的是地址
return bo= Arrays.equals(ch1,ch2)?true:false;
}
}