String 中equals方法和hashcode方法

equals()和hashcode()这两个方法都是从object类中继承过来的。 
equals()方法在object类中定义如下: 

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

是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们必需清楚,当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。比如在String类中如下:

    

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            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) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

这是在进行的内容比较,而已经不再是地址的比较。依次类推Double、Integer、Math等等这些类都是重写了equals()方法的,从而进行的是内容的比较。

Java语言对equals()的要求如下,这些要求是必须遵循的: 
• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 
• 反射性:x.equals(x)必须返回是“true”。 
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
 
以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果


hashcode() 方法在object类中定义如下: 

public native int hashCode(); 
说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double等等这些类都是覆盖了hashcode()方法的。

下面是String类中hashcode方法:

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

测试:

String str1=new String("abc");
String str2=new String("abc");
String str3="abc";
String str4="abc";

System.out.println(str1.equals(str2));//true
System.out.println(str1==str2);//false
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
System.out.println(str1.hashCode()==str2.hashCode());//true
System.out.println("===============================");
System.out.println(str3.equals(str4));//true
System.out.println(str3==str4);//true
System.out.println(str3.hashCode());
System.out.println(str4.hashCode());
System.out.println(str3.hashCode()==str4.hashCode());//true
System.out.println("===============================");

Object obj1=new Object();
Object obj2=new Object();
System.out.println(obj1.equals(obj2));//false
System.out.println(obj1==obj2);//false
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
System.out.println(obj1.hashCode()==obj2.hashCode());//false

原文:http://blog.csdn.net/winer2008/article/details/4059789


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值