equals与==的区别。

下面是equals的源码  

public boolean equals(Object anObject) {
  if (this == anObject) {  //如果两个对象相等则返回true
    return true;
  }
  if (anObject instanceof String) {  //字符串调用equals时
    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) {  //判断两个字符串相同下边的字符的值是否相同,如果出现不相等,就会返回false
    if (v1[i] != v2[i])
      return false;
      i++;
    }
    return true;
    }
  }
  return false;
}

equals: 用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==: 包含基本数据类型的比较 以及判断引用是否指向堆内存的同一块地址。

下面我们举些例子说明下:

   第一种情况:

String s1 = new String("test");
String s2 = new String("test");

System.out.println(s1==s2);            //new String()两个字符串的显然不是同一块地址,故返回false
System.out.println(s1.equals(s2));    //两个字符串的值相同,故返回true

第二种情况:
String s1 = new String("test");
String s2 = s1;

System.out.println(s1==s2);            //由于s2引用了s1的对象,同一地址,返回true
System.out.println(s1.equals(s2));    //s1 = "test",s2 = "test",故返回true

第三种情况:

String s1 = "java";
String s2 = "java";

System.out.println(s1==s2);            //因为s1 = "java",当定义s2 = "java"时"java"已经存在,s2引用缓存"java",所以引用地址想同,返回true
System.out.println(s1.equals(s2));    //很明显,s1.equals(s2),返回true