关闭

Java中==与equals的区别(可以试下重写hashcode与equals方法)

标签: Javaequals
290人阅读 评论(0) 收藏 举报
分类:

java中 == 与 equal 的区别

废话不多说了,开门见山吧,先来看一段代码:

复制代码
String str1 = new String("str");
        String str2 = new String("str");
        System.out.println("==比较 :"+ (str1 == str2));
        System.out.println("equal比较:"+ str1.equals(str2));
        String str3 = "str1";
        String str4 = "str1";
        System.out.println("==比较 :"+ (str3 == str4));
        System.out.println("equal比较:"+ str3.equals(str4));
复制代码

输出的答案:

以上的输出结果有误,应该是

false

equal比较:true

true

equal比较:true

 

根据打印的可以发现使用equal比较时无论是使用自动装箱来实例化还是用new来实例化,返回的都true,而用==则不一样了,自动装箱来实例化的返回的是true,而用new来

实例化的返回的确实false;先不急着解决为什么,先来了解下equals和==的区别,到时候就可以知道答案了

equals方法最初是在所有类的基类Object中进行定义的,源码是

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

可以看出这里定义的equals与==是等效的,但上面的怎么还会不一样呢?
原因就是String类对equals进行了重写:

复制代码
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;
    }
复制代码

这里对equals重新需要注意五点:

1   自反性:对任意引用值X,x.equals(x)的返回值一定为true. 
2   对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true; 
3   传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true 
4   一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变 
5   非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 

经过重写后就跟==有本质的区别了:

equal:是用来比较两个对象内部的内容是否相等的,由于所有的类都是继承自java.lang.Object类的,所以如果没有对该方法进行覆盖的话,调用
的仍然是Object类中的方法,而Object中的equal方法返回的却是==的判断,因此,如果在没有进行该方法的覆盖后,调用该方法是没有
任何意义的。在java面向对象的处理中我们一般在javabean中都要选择重写equals方法,使用hibernate后,我们要生成数据库的映射文件与实体

类,这是我们就最好在实体类中进行equals方法的重写,重写时我们可以根据自己的定义来实现该方法只要遵守那五条原则,例如对于一个student类

我们定义只要在学号相同时我们就认为这两个对象时相等的;同时我们还要重写hashcode方法http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html
==:是用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

待续

0
0
查看评论

如何正确的重写equals() 和 hashCode()方法

equals和hashCode重写技巧
  • zzg1229059735
  • zzg1229059735
  • 2016-05-25 15:36
  • 7361

9. 【对于所有对象都通用的方法】重写equals方法时一定也要重写hashCode方法

本文是《Effective Java》读书笔记第9条:在每个覆盖了equals方法的类中,一定也要覆盖hasCode方法。否则会导致该类无法结合所有基于散列的集合一起正常工作。
  • get_set
  • get_set
  • 2016-07-11 23:01
  • 538

java为什么要重写hashCode和equals方法

如果不被重写(原生)的hashCode和equals是什么样的?       不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。      不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(obje...
  • zknxx
  • zknxx
  • 2016-12-24 21:17
  • 6186

对于自定义类,重写equals方法和hashCode方法的技巧

参考:http://blog.csdn.net/fenglibing/article/details/8905007 对于自定义的类,如果要比较两个对象是否相同,就需要重写equals方法。举一个例子进行说明: 先自定义一个类,包含两个属性:class Person{ private Stri...
  • Genius_zz
  • Genius_zz
  • 2016-09-16 21:15
  • 4468

HashMap中的equals和hashCode

Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的作用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀。为了说明它们的关系,我们需要HashMap的背景知识。HashMap的存储方式Has...
  • qiuych3
  • qiuych3
  • 2016-05-06 21:26
  • 1492

为什么要重写hashcode和equals方法?

为什么要重写hashcode和equals方法? 相信很多小伙伴被这个问题给困扰很久了,下面我就给大家详细说一下我的理解吧~ 因为默认的hequals方法是Object的方法,比较的是内存地址;而默认的hashcode方法返回的是对象的内存地址转换成的一个整数,实际上指的的也是内存,两个...
  • world6
  • world6
  • 2016-08-05 11:42
  • 1501

HashMap什么时候重写hashcode和equals方法,为什么需要重写

转载自:http://bdcwl.blog.163.com/blog/static/765222652009112744733937/ HashSet内部是通过HashMap实现。只有使用排序的时候才使用TreeMap。否知使用HashMap。 HashSet  set = n...
  • VIP_WangSai
  • VIP_WangSai
  • 2017-08-23 14:26
  • 784

Java中==和equals的区别,equals和hashCode的区别

==是运算符,用于比较两个变量是否相等。 equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。Object的equals方法如下: public boolean equals(Object obj) { ...
  • tiantiandjava
  • tiantiandjava
  • 2015-07-21 17:01
  • 19805

详解重写equals()方法就必须重写hashCode()方法的原因

重写的作用: 如果重写(用于需求,比如建立一个Person类,比较相等我只比较其属性身份证相等就可不管其他属性,这时候重写)equals,就得重写hashCode,和其对象相等保持一致。如果不重写,那么一定保持一致。 1. 重写equals()方法就必须重写hash...
  • u013679744
  • u013679744
  • 2017-02-25 10:04
  • 3470

Java重写equals方法必须重写hashcode方法的意义

Java重写equals方法必须重写hashcode方法的意义
  • u011446250
  • u011446250
  • 2017-04-22 11:28
  • 276
    个人资料
    • 访问:65765次
    • 积分:1235
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:33篇
    • 译文:0篇
    • 评论:4条
    博客快捷方式
    最新评论
    我的微博