您的位置:首页 > 职场人生

07.(java基础)面试题04 ==,equals区别

2015-12-24 14:55 531 查看
1. ==

  java中的==是比较两个对象在JVM中的地址。比较好理解。看下面的代码:

1 public class ComAddr{
2     public static void main(String[] args) throws Exception {
3         String s1 = "nihao";
4         String s2 = "nihao";
5         String s3 = new String("nihao");
6         System.out.println(s1 == s2);    //    true
7         System.out.println(s1 == s3);    //    false
8     }
9 }


  上述代码中:

  (1)s1 == s2为true,是因为s1和s2都是字符串字面值"nihao"的引用,指向同一块地址,所以相等。

  (2)s1 == s3为false,是因为通过new产生的对象在堆中,s3是堆中变量的引用,而是s1是指向字符串字面值"nihao"的引用,地址不同所以不相等。

2.equals()(注意:equals底层调用的是==方法,然而String方法却特殊,先比较地址,若不相同在逐个比较字符串中的每一个字符)

  equals是根类Obeject中的方法。源代码如下:

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


  可见默认的equals方法,直接调用==,比较对象地址。

  不同的子类,可以重写此方法,进行两个对象的equals的判断。

  String类源码中重写的equals方法如下,

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     }


  从上面的代码中可以看到,

  (1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。

  (2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: