public boolean equals(Object anObject) {
//判断地址值是否相等
if (this == anObject) {
return true;
}
//判断对象类型是否为String
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
//判断长度是否相等
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
//每一个字符都必须相同
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
上面是equals方法的源码,从源码中可以看出在使用equals方法的时候,首先是比较
如果两个对象的地址相同(同一个对象),那么equals返回true
如果如果两个对象的地址不同的时候再比较是否都为String类型实例,如果不是String类型就直接返回为false
如果是String类型的时候就开始比较长度,如果长度相同再开始比较逐个字符比较是否相同,全部相同放回true否则返回false。
----------------------------------------------------------------------------------------------------------------------------------------------------
一般的说==和equals的区别的时候会有
== 对于基本类型,比较值是否相等,对于对象,比较的是两个对象的地址是否相同,即是否是指相同一个对象。
equals的默认实现实际上使用了==来比较两个对象是否相等,但是像Integer、String这些类对equals方法进行了重写,比较的是两个对象的内容是否相等。
对于Integer,如果依然坚持使用==来比较,有一些要注意的地方。对于[-128,127]区间里的数,有一个缓存。因此
Integer a = 127; Integer b = 127; System.out.println(a == b); // true Integer a = 128; Integer b = 128; System.out.println(a == b); // false // 不过采用new的方式,a在堆中,这里打印false Integer a = new Integer(127); Integer b = 127; System.out.println(a == b);
对于String,因为它有一个常量池。所以
String a = "gg" + "rr";
String b = "ggrr";
System.out.println(a == b); // true
// 当然牵涉到new的话,该对象就在堆上创建了,所以这里打印false
String a = "gg" + "rr";
String b = new String("ggrr");
System.out.println(a == b);
本文深入解析了Java中String类的equals方法实现原理,详细解释了equals方法如何比较字符串对象的地址和内容,以及与==操作符的区别。通过具体示例展示了Integer和String类型在不同情况下的比较结果。
466

被折叠的 条评论
为什么被折叠?



