若是是比较基本数据类型的只须要比较值就能够java
int a = 1; long b = 1l; double c = 1; System.out.println(a==b); System.out.println(b==c); true true
二者比较的都是地址值,this
Student student1 = new Student(); Student student2 = new Student(); System.out.println(student1.equals(student2)); System.out.println(student1 == student2); false false
很容易理解,两对象的地址值不一样,因此都为false。code
再来看一段代码对象
String s1 = "abc"; String s2 = "abc"; System.out.println(s1==s2); System.out.println(s1.equals(s2)); System.out.println("------------"); String s3 = "abc"; String s4 = new String("abc"); System.out.println(s3==s4); System.out.println(s3.equals(s4)); System.out.println("---------------"); String s5 = new String("abc"); String s6 = new String("abc"); System.out.println(s5==s6); System.out.println(s5.equals(s6)); true true ------------ false true --------------- false true
string类有点特殊,string s4 = "abc";,也至关于String s4 = new String("abc");代码中s1==s2,是由于当定义string s2 = "abc"以前s1已经存在常量池中,因此s2直接指向了s1。这就使得s1==s2的返回值为true。打开string类的equals方法,源码是被重写了的,源码
public boolean equals(Object anObject) { if (this == anObject) { return true; } 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;
对象地址相同直接返回true,string