今天突然想到equals和==的区别这个问题,发现也就知道一个是比值一个是比地址的,其他云云就非常模糊,用起来也不是很顺手,趁着周五晚上的时间找了一篇文章,感觉讲的挺好,就把它翻译下来,如下:
equals方法和==操作符用来比较两个数字或者是字符串,equals方法的内部是用==来实现比较操作的,包装类重写equals方法
1、如果是基本数据类型,这个==操作符,比较他们的值,如果是对象的话,那么==操作符比较的是地址。
2、equals方法比较的是对象的值,而不比较地址。
使用equals方法和==操作符比较Integer和int
3、如果使用==比较同一个对象,返回的是true,因为Java虚拟机内部会进行拆箱操作(包装类转换为对应的基本数据类型)
4、比较对象值得时候,equals方法返回true,实际上的实现如下:(这其实是一个比较简单的equals)
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
对Object类的源码中equals的实现比较好奇,查了一下源码,并附上String的equals和HashMap的equals,对源码感兴趣的同学可研究一下,不想了解的可以直接到5
Object:
public boolean equals(Object obj) {
return (this == obj)
}
String:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
HashMap:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Map))
return false;
Map<K,V> m = (Map<K,V>) o;
if (m.size() != size())
return false;
try {
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext()) {
Entry<K,V> e = i.next();
K key = e.getKey();
V value = e.getValue();
if (value == null) {
if (!(m.get(key)==null && m.containsKey(key)))
return false;
} else {
if (!value.equals(m.get(key)))
return false;
}
}
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
return true;
}
5、使用equals方法和==操作符比较Strings
6、对象使用==操作符比较返回false,因为其比较的是地址。
下边是三个例子:
①:
public static void main(String[] args){
int obj1 = 10;
int obj2 = obj1 ;
Integer obj3 = new Integer(10);
Integer obj4 = new Integer(10);
if(obj1 == obj2){
System.out.println("== Test 1: Both are equals");
}
if(obj3 == obj4){ // will fail , both are objects
System.out.println("== Test 2: Both are equals");
}
if(obj1 == obj3){ //JVM unboxing
System.out.println("== Test 3: Both are equals");
}
if(obj3.equals(obj4)){
System.out.println("equals()Test 1: Both are equals");
}
if(obj3.equals(obj1)){
System.out.println("equals() Test 2: Both are equals");
}
}
输出结果:
== Test 1: Both are equals
== Test 3: Both are equals
equals()Test 1: Both are equals
equals() Test 2: Both are equals
②:
public class equalsInObject extends Object{
String str1 = new String("hello");
String str2 ;
public void compare(){
str2 = new String("hello");
if(new equalsInObject().equals(str2)){
System.out.println("true");
}else{
System.out.println("false");
}
}
public static void main(String[] args){
new equalsInObject().compare();
}
public boolean equals(Object obj){
char ch1[]= ((String)obj).toCharArray();
char ch2[]= str1.toCharArray();
if(ch1.length == ch2.length)
for(int i = 0;i<((String)obj).length();i++){
if(ch1[i] == ch2[i]){
continue;
}else{
return false;
}
}
return true;
}
输出结果:
output : true
③(这个是我自己写的):
package com.other.test;
public class TestEquals {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("abc");
String s3 = "abc";
String s4 = "abc";
if(s1.equals(s2))
System.out.println("s1.equals(s2) is TRUE");
else
System.out.println("s1.equals(s2) is FALSE");
if(s1==s2)
System.out.println("s1==s2 is TRUE");
else
System.out.println("s1==s2 is FALSE");
if(s3.equals(s4))
System.out.println("s3.equals(s4) is TRUE");
else
System.out.println("s3.equals(s4) is FALSE");
if(s3==s4)
System.out.println("s3==s4 is TRUE");
else
System.out.println("s3==s4 is FALSE");
}
}
输出结果:
s1.equals(s2) is TRUE
s1==s2 is FALSE
s3.equals(s4) is TRUE
s3==s4 is TRUE
关于他们的区别还有一些好文章大家可以参考一下:
http://stackoverflow.com/questions/7311451/difference-between-equals-and-instanceof
http://www.coderanch.com/t/409507/java/java/Difference-equals