java中的数据类型可分为2种:
1.基本数据类型
基本数据类型之间的比较用==,比较的是它们的数值。
2.引用数据类型
(1)引用数据类型用==比较,比较的是内存中的存放地址。所以,如果2个对象指向内存中的同一块区域,比较结果为true,否则为false。
(2)Java中所有类都继承自Object这个基类,在Object基类中有一个equals方法public boolean equals(Object o){
return this==o;
}
可以看出,在Object基类中equals方法本质上还是和==一样,但是在有些类库中重写了基类中的equals方法,如String,Integer,Date类等,这些类中的equals方法有其自身的实现。
所以,引用类型用equals比较,如果没有重写基类中的equals方法,比较结果还是和(==)比较结果一样,如果重写了equals方法,如String类:
1 public boolean equals(Object anObject) {
2 if (this == anObject) {
3 return true;
4 }
5 if (anObject instanceof String) {
6 String anotherString = (String)anObject;
7 int n = value.length;
8 if (n == anotherString.value.length) {
9 char v1[] = value;
10 char v2[] = anotherString.value;
11 int i = 0;
12 while (n-- != 0) {
13 if (v1[i] != v2[i])
14 return false;
15 i++;
16 }
17 return true;
18 }
19 }
20 return false;
21 }
从String类重写equals方法来看,String类的equals方法比较的是两个字符串的内容。
下面通过实例来看看String类的比较:
public class TestString {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
运行结果:
true
true
字符串缓冲池:程序在运行的时候会创建一个字符串缓冲池,当使用 s2 = “abc”这样的表达式创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象。s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1,将s2引用s1所引用的对象”abc”.
故s1,s2指向同一个内存区域,所以==和equals比较结果都是true.
修改程序:
public class TestString {
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
运行结果:
false
true
s1被创建的时候,同样放入缓冲池,在创建s2的时候,明确告诉程序:“要创建一个新的对象,不要旧的”,于是,新的“abc”对象被创建在内存中,他们的值相同,但是内存地址不同。