java中的数据类型,可分为两类:
1.基本数据类型。
byte,short,char,int,long,float,double,boolean这八大原始数据类型他们之间的比较,使用“==”,比较的是他们的值。
2.符合数据类型
符合数据类型,用“==”比较时候,比较的是它们在内存中的存放地址。java中所以的类都是继承于Object这个基类的,Object中有个equals()方法,这个方法比较也是对象的内存地址,但是继承自它的子类都重新了equals方法,所以很多类的equals()比较的不再是堆内存中的存放地址了。
2.1 String的equals()方法
String类的equals方法使用的比较多,我们以String类为例。
public class TestString { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); if (s1 == s2) { System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } if (s1.equals(s3)) { System.out.println("s1 equals s3"); }else { System.out.println("s1 not equals s3"); } }}
输出:
s1 == s2s1 equals s3
2.2 JDK源码equals()
2.2.1 Object的equals()方法
public boolean equals(Object obj) { return (this == obj); }
可以看出来,Object的equals方法就是比较内存地址,正是由于一些子类重写了equals方法,才会有了 equals和==的区别。换句话说,我们自定义的类,如果没有重写equals方法,那么久默认equals比较的是内存地址。
2.2.2 String重写了父类Object的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; }
从这段源码可以看出来,Sting类型的equals比较的是引用的对象的值。