==和equals()的区别有两种情况:
一种是针对object类一种是针对string 类
如下解释可看出对于object类来说==和equals()是一样的。但是由于String类重写了equals(),所以String 与Object又有所区别
Object的equals
public boolean equals (Object obj)
指示其他某个对象是否与此对象“相等”。
Object 类的equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
equals 方法在非空对象引用上实现相等关系:
· 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
· 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x)返回 true 时,x.equals(y) 才应返回true。
· 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
· 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y)始终返回 true 或始终返回 false,前提是对象上equals 比较中所用的信息没有被修改。
· 对于任何非空引用值 x,x.equals(null) 都应返回 false。
string类的equals
public boolean equals(Object anObject)
将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false
下面来看一个例子:
class Y{
int i;
}
public class X {
public static void main(String [] args) {
Y y=new Y();
Y y1=new Y();
y.i=10;
y1.i=10;
System.out.println("y.equals(y1):"+y.equals(y1));
System.out.println("y==y1:"+(y==y1));
String a=new String("abc");
String a1=new String("abc");
System.out.println("a.equals(a1):"+a.equals(a1));
System.out.println("a==a1:"+(a==a1));
String b="abc";
String b1="abc";
System.out.println("b.equals(b1):"+b.equals(b1));
System.out.println("b.equals(b1):"+(b==b1));
System.out.println("b.equals(a):"+b.equals(a));
System.out.println("b==a:"+(b==a));
System.out.println("a:"+a.hashCode());
System.out.println("a1:"+a1.hashCode());
System.out.println("b:"+b.hashCode());
System.out.println("b1:"+b1.hashCode());
}
}
输出结果为:
y.equals(y1):false
y==y1:false
a.equals(a1):true
a==a1:false
b.equals(b1):true
b.equals(b1):true
b.equals(a):true
b==a:false
a:96354
a1:96354
b:96354
b1:96354
对于y引用equals和==是一样的,因为y和y1指向不同对象,故其对应值应该都为false
String a=new String(“abc”); 处,系统(在指定内存中)先建立一个“abc”对象实例再通过String构建器创建“abc”的副本存入a指向的对象(在堆中,不在常量池中)中。如后面的a1同理。而在执行String b="abc";时系统不会再去开辟内存空间,而是直接在缓冲池中找到原先第一次创建的“abc”的,并指向它。同理b1.故对着几个引用变量调用用equals()因他们指向的对象实例对视相同的(查看结果的hashcode()值也是一样的),结果都应为true。因引用b和a不是指向同一个对象,所以b==a应该是false(其他的同理)。
注:1、String的一个构造函数:public String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
参考:http://blog.csdn.net/fiempty/article/details/8640467
初学java以上说明如有不妥之处,请见谅。