java中equals和==的比较

equals是JAVA中最底层父类Object中提供的方法,我们不妨看下Object的源码:

public boolean equals(Object obj) { return (this obj); }

如上列代码,对一般的对象而言(没有重写equals方法),equals采用的就是判断对象是否相等,所以没有任何区别。

比较的内存地址是否一致,所以2个对象判断一般输出false。

1.字符常量

String str2=”123″;
String str1=”123″;
上述的str1和str2因为是字符串常量,都存放在字符串常量池,所以不仅值相同连内存地址也是相同的,

str1str2输入true,str1.equals(str2)也输出true

内存分类可以看这里–>http://wei8888go.ecjtu.org/java%E5%86%85%E5%AD%98%E5%88%92%E5%88%86%E6%83%85%E5%86%B5/

2.字符串对象

String str3=new String(“3”);
String str4=new String(“3”);

str1str2输入false,str1.equals(str2)输出true

因为判断的是在内存上的地址是否相同,str1,str2都是对象,存放在不同的地址上,所以输出false。

为什么equals会输入true呢?因为string类重写了equals方法,且看源代码

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; }

3.对象重写equals方法

重写equals方法后可以自定义比较方法!如下列对Student对象的比较,之比较其中一个属性str是否相同

class Student{ String str; public Student(String str) { super(); this.str = str; } public boolean equals(Object obj) { // TODO Auto-generated method stub if(obj instanceof Student){ return this.str.equals(((Student) obj).str); } return false; } }

public static void main(String[] args){ Test4.Student s1=new Test4().new Student("1001"); Test4.Student s2=new Test4().new Student("1001"); System.out.println(s1.equals(s2)); System.out.println(s1==s2); }