1.equals用法
个人的归纳总结:
- 用于String类型之间的比较时,调用的是String类的equals()方法,比较的是字符串的内容而不是地址,并且只能用于比较String类型,因为StringBuffer和StringBuilder类中都没有equals()方法。
- 用于其他类型之间(包括含有一个Sting类型的情况)的比较时,以o1.equals(o2)为例: 若o1是String类型,则调用的时String类的equals方法,返回值为false;若o1不是String类型,则调用的是Object类的equals()方法(此时与==用法相同),比较的是引用变量的地址而不是内容。
1 private static void equalsAnal() {
2 String s1 = "hello";
3 String s2 = "hello";
4 String s3 = new String("hello");
5 String s4 = new String("hello");
6 String s5 = new String(new StringBuffer("hello"));
7
8 StringBuffer s6 = new StringBuffer("hello");
9 StringBuffer s7 = new StringBuffer("hello");
10
11 System.out.println(s1.equals(s2));//true
12 System.out.println(s3.equals(s4));//true
13
14 System.out.println(s1.equals(s3));//true
15
16 System.out.println(s1.equals(s5));//true
17 System.out.println(s3.equals(s5));//true
18
19 System.out.println(s6.equals(s7));//false
20 System.out.println(s1.equals(s6));//false
21 System.out.println(s3.equals(s6));//false
22 System.out.println(s5.equals(s6));//false
23 System.out.println(s6.equals(s1));//false
24 }
对于上述代码的结果,我们可以结合String类以及Object类的源码来进行分析:
1 //String类中的equals方法,这其实是重写了Object类中的equals方法,因为String类继承自Object类
2 public boolean equals(Object anObject) {
3 if (this == anObject) {
4 return true;
5 }
6 if (anObject instanceof String) {
7 String anotherString = (String)anObject;
8 int n = value.length;
9 if (n == anotherString.value.length) {
10 char v1[] = value;
11 char v2[] = anotherString.value;
12 int i = 0;
13 while (n-- != 0) {
14 if (v1[i] != v2[i])
15 return false;
16 i++;
17 }
18 return true;
19 }
20 }
21 return false;
22 }
1 //Object类中的equals方法
2 public boolean equals(Object obj) {
3 return (this == obj);
4 }
2. ==用法
==是一种关系运算符,用于基本数据类型时,比较的是两个变量的值是否相等;用于引用类型时,比较的是两个引用变量的地址是否相同。
1 int a = 10, b = 10;
2 char ch1 = 'A', ch2 = 'A';
3 String str1 = "hello";
4 String str2 = "hello";
5 Integer n1 = new Integer(10);
6 Integer n2 = new Integer(10);
7
8 System.out.println(a == b);//true
9 System.out.println(ch1 == ch2);//true
10 System.out.println(str1 == str2);//true
11 System.out.println(n1 == n2);//false
3.用法比较
1 String s1 = "hello";
2 String s2 = "hello";
3 String s3 = new String("hello");
4 String s4 = new String("hello");
5 String s5 = new String(new StringBuffer("hello"));
6
7 StringBuffer s6 = new StringBuffer("hello");
8 StringBuffer s7 = new StringBuffer("hello");
9
10 System.out.println(s1.equals(s2));//true
11 System.out.println(s1==s2);//true
12
13 System.out.println(s3.equals(s4));//true
14 System.out.println(s3==s4);//false
15
16 System.out.println(s1.equals(s3));//true
17 System.out.println(s1==s3);//false
18
19 System.out.println(s1.equals(s5));//true
20 System.out.println(s1==s5);//false
21
22 System.out.println(s3.equals(s5));//true
23 System.out.println(s3==s5);//false
综上所述,equals和==用法相同的情况:
- 字符串为基本数据类型String的变量;
- 比较的是两个非String类型的引用变量。