`
devon.k
  • 浏览: 88413 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中的==和equals浅见

阅读更多
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
  他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
  对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
//Object中的equals方法	
public boolean equals(Object obj) {
	return (this == obj);
}


当然,你也可以重写Object的equals方法,这儿就有个问题啦,参加公司笔试的时候相信N多人都被要求回答过这样的问题:在重写了对象的equals方法后,还需要重写hashCode方法吗?为什么?
我认为,出于程序完整性的考虑,在重写了对象的equals方法后,是有必要重写对象的hashCode方法的。
因为,你重写了equals方法,你调用它来进行对象间的比较,你可以达到你的比较目的,但是,当你想将你的对象存入类似HashSet这类对象中时,问题就出现了(没有重写hashCode方法的情况下)。
Set(集)中是不允许有重复的值的,而判断值是否重复,是通过比较他们的hashCode值的。你通过你重写后的equals比较对象,结果是相等,但用hashCode值比较他们时是不相等的,所以,为了比较结果的一致性,需要重写hashCode方法。
下面是String类重写了的equals方法和hashCode方法:
//此方法的目的是,实现在不同的String对象之间比较,比较的是他们的字符串值
public boolean equals(Object anObject) {

         if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value; //字符串的值,用字符数组表示
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
    
    //返回的值是基于字符串的值运算出来的,
     //字符串值相等则他们的hashCode值也相等,否则,不相等
     public int hashCode() {
	int h = hash;
	if (h == 0) {
	    int off = offset;
	    char val[] = value; //字符串的值,用字符数组表示
	    int len = count;
            //基于字符串的值产生hash值
            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }


问:对象的hashcode是用来干什么的?
简答:容器类经常用到hascode,比如说set判断重复值,比如说hashmap散列。等等。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics