博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
==和equals的简单比较
阅读量:7093 次
发布时间:2019-06-28

本文共 17174 字,大约阅读时间需要 57 分钟。

前言:==和equals这个两个东西,经常放在一块做比较,下面我也给出一个简单的例子,对他俩进行一个简单的比较,先看例子,然后在看结论。(实验环境:win7+jdk7)

1:==和equals简单比较的实例代码如下

public class BooleanTestMain {    public static void main(String [] args){        Boolean _Boolean1 = true;        Boolean _Boolean2 = true;        Boolean _Boolean3 = new Boolean(true);        Boolean _Boolean4 = new Boolean(true);        //输入对象的hashCode和identityHashCode,当对应的类没有重写hashCode()方法时,hashCode和identityHashCode是一致的        System.out.println("_Boolean1.hashCode() is : "+_Boolean1.hashCode()+"   System.identityHashCode(_Boolean1) is : "+ System.identityHashCode(_Boolean1));        System.out.println("_Boolean2.hashCode() is : "+_Boolean2.hashCode()+"   System.identityHashCode(_Boolean2) is : "+ System.identityHashCode(_Boolean2));        System.out.println("_Boolean3.hashCode() is : "+_Boolean3.hashCode()+"   System.identityHashCode(_Boolean3) is : "+ System.identityHashCode(_Boolean3));        System.out.println("_Boolean4.hashCode() is : "+_Boolean4.hashCode()+"   System.identityHashCode(_Boolean4) is : "+ System.identityHashCode(_Boolean4));        //==比较的是对象引用地址值        System.out.println("_Boolean1==_Boolean2 is : "+(_Boolean1==_Boolean2));        System.out.println("_Boolean3==_Boolean4 is : "+(_Boolean3==_Boolean4));        System.out.println("_Boolean1==_Boolean3 is : "+(_Boolean1==_Boolean3));        //equals比较的是对象的值,如果对象没有重写equals的话,其作用和==一样,因为Object类的equals也是通过==来比较的        System.out.println("_Boolean1.equals(_Boolean2) is : "+(_Boolean1.equals(_Boolean2)));        System.out.println("_Boolean3.equals(_Boolean4) is : "+(_Boolean3.equals(_Boolean4)));        System.out.println("_Boolean1.equals(_Boolean3) is : "+(_Boolean1.equals(_Boolean3)));    }}

 上例运行的结果如下:

"C:\Program Files\Java\jdk1.7.0_71\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\rt.jar;D:\workspace_test\hello-world\out\production\hello-world;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.jd.test.equ.BooleanTestMain_Boolean1.hashCode() is : 1231   System.identityHashCode(_Boolean1) is : 1969344019_Boolean2.hashCode() is : 1231   System.identityHashCode(_Boolean2) is : 1969344019_Boolean3.hashCode() is : 1231   System.identityHashCode(_Boolean3) is : 1746959769_Boolean4.hashCode() is : 1231   System.identityHashCode(_Boolean4) is : 756415799_Boolean1==_Boolean2 is : true_Boolean3==_Boolean4 is : false_Boolean1==_Boolean3 is : false_Boolean1.equals(_Boolean2) is : true_Boolean3.equals(_Boolean4) is : true_Boolean1.equals(_Boolean3) is : trueProcess finished with exit code 0

2:Boolean类的部分源码如下所示,重写了Object的hashCode()和equals()方法

/**     * Returns a hash code for this {
@code Boolean} object. * * @return the integer {
@code 1231} if this object represents * {
@code true}; returns the integer {
@code 1237} if this * object represents {
@code false}. */ public int hashCode() { return value ? 1231 : 1237; } /** * Returns {
@code true} if and only if the argument is not * {
@code null} and is a {
@code Boolean} object that * represents the same {
@code boolean} value as this object. * * @param obj the object to compare with. * @return {
@code true} if the Boolean objects represent the * same value; {
@code false} otherwise. */ public boolean equals(Object obj) { if (obj instanceof Boolean) { return value == ((Boolean)obj).booleanValue(); } return false; }

3:Object类的equals()方法的源码如下所示,也是通过==来比较的

/**     * Indicates whether some other object is "equal to" this one.     * 

* The {

@code equals} method implements an equivalence relation * on non-null object references: *

    *
  • It is reflexive: for any non-null reference value * {
    @code x}, {
    @code x.equals(x)} should return * {
    @code true}. *
  • It is symmetric: for any non-null reference values * {
    @code x} and {
    @code y}, {
    @code x.equals(y)} * should return {
    @code true} if and only if * {
    @code y.equals(x)} returns {
    @code true}. *
  • It is transitive: for any non-null reference values * {
    @code x}, {
    @code y}, and {
    @code z}, if * {
    @code x.equals(y)} returns {
    @code true} and * {
    @code y.equals(z)} returns {
    @code true}, then * {
    @code x.equals(z)} should return {
    @code true}. *
  • It is consistent: for any non-null reference values * {
    @code x} and {
    @code y}, multiple invocations of * {
    @code x.equals(y)} consistently return {
    @code true} * or consistently return {
    @code false}, provided no * information used in {
    @code equals} comparisons on the * objects is modified. *
  • For any non-null reference value {
    @code x}, * {
    @code x.equals(null)} should return {
    @code false}. *
*

* The {

@code equals} method for class {
@code Object} implements * the most discriminating possible equivalence relation on objects; * that is, for any non-null reference values {
@code x} and * {
@code y}, this method returns {
@code true} if and only * if {
@code x} and {
@code y} refer to the same object * ({
@code x == y} has the value {
@code true}). *

* Note that it is generally necessary to override the {

@code hashCode} * method whenever this method is overridden, so as to maintain the * general contract for the {
@code hashCode} method, which states * that equal objects must have equal hash codes. * * @param obj the reference object with which to compare. * @return {
@code true} if this object is the same as the obj * argument; {
@code false} otherwise. * @see #hashCode() * @see java.util.HashMap */ public boolean equals(Object obj) { return (this == obj); }

 4:为了认清==比较的本质,我又多实验了一把,如下所示

public class EquStringTestMain {    public static void main(String[]args){        String _String1 = "godtrue";        String _String2 = "godtrue";        System.out.println("_String1 value is : "+_String1+"\n_String2 value is : "+_String2);        System.out.println("_String1 identityHashCode is :"+System.identityHashCode(_String1)+"\n_String2 identityHashCode is :"+System.identityHashCode(_String2));        System.out.println("_String1==_String2 is : "+(_String1==_String2)+"\n");        String _String3 = new String("godtrue");        String _String4 = new String("godtrue");        System.out.println("_String3 value is : "+_String3+"\n_String4 value is : "+_String4);        System.out.println("_String3 identityHashCode is :"+System.identityHashCode(_String3)+"\n_String4 identityHashCode is :"+System.identityHashCode(_String4));        System.out.println("_String3==_String4 is : "+(_String3==_String4)+"\n");        String _String5 = _String1;        String _String6 = _String1;        System.out.println("_String5 value is : "+_String5+"\n_String6 value is : "+_String6);        System.out.println("_String5 identityHashCode is :"+System.identityHashCode(_String5)+"\n_String6 identityHashCode is :"+System.identityHashCode(_String6));        System.out.println("_String5==_String6 is : "+(_String5==_String6)+"\n");        String _String7 = _String3;        String _String8 = _String3;        System.out.println("_String7 value is : "+_String7+"\n_String8 value is : "+_String8);        System.out.println("_String7 identityHashCode is :"+System.identityHashCode(_String7)+"\n_String8 identityHashCode is :"+System.identityHashCode(_String8));        System.out.println("_String7==_String8 is : "+(_String7==_String8)+"\n");        String _String9 = _String1;        String _String0 = _String3;        System.out.println("_String9 value is : "+_String9+"\n_String0 value is : "+_String0);        System.out.println("_String9 identityHashCode is :"+System.identityHashCode(_String9)+"\n_String0 identityHashCode is :"+System.identityHashCode(_String0));        System.out.println("_String9==_String0 is : "+(_String9==_String0)+"\n");    }}

 上例运行的结果,如下所示(每次运行identityHashCode都不同的哟):

"C:\Program Files\Java\jdk1.7.0_71\bin\java" -Didea.launcher.port=7534 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\rt.jar;D:\workspace_test\hello-world\out\production\hello-world;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.jd.test.equ.EquStringTestMain_String1 value is : godtrue_String2 value is : godtrue_String1 identityHashCode is :1748462787_String2 identityHashCode is :1748462787_String1==_String2 is : true_String3 value is : godtrue_String4 value is : godtrue_String3 identityHashCode is :247835561_String4 identityHashCode is :1401482194_String3==_String4 is : false_String5 value is : godtrue_String6 value is : godtrue_String5 identityHashCode is :1748462787_String6 identityHashCode is :1748462787_String5==_String6 is : true_String7 value is : godtrue_String8 value is : godtrue_String7 identityHashCode is :247835561_String8 identityHashCode is :247835561_String7==_String8 is : true_String9 value is : godtrue_String0 value is : godtrue_String9 identityHashCode is :1748462787_String0 identityHashCode is :247835561_String9==_String0 is : false

5:String类相对特殊一点,再来一个栗子尝尝

public class EquTestMain {    public static void main(String[]args){        int int1 = 9;        int int2 = 9;        System.out.println("int1 value is : "+int1+"\nint2 value is : "+int2);        System.out.println("int1 identityHashCode is :"+System.identityHashCode(int1)+"\nint2 identityHashCode is :"+System.identityHashCode(int2));        System.out.println("int1==int2 is : "+(int1==int2)+"\n");        Integer _Integer1 = 9;        Integer _Integer2 = 9;        System.out.println("_Integer1 value is : "+_Integer1+"\n_Integer2 value is : "+_Integer2);        System.out.println("_Integer1 identityHashCode is :"+System.identityHashCode(_Integer1)+"\n_Integer2 identityHashCode is :"+System.identityHashCode(_Integer2));        System.out.println("_Integer1==_Integer2 is : "+(_Integer1==_Integer2)+"\n");        Integer _Integer3 = new Integer(9);        Integer _Integer4 = new Integer(9);        System.out.println("_Integer3 value is : "+_Integer3+"\n_Integer4 value is : "+_Integer4);        System.out.println("_Integer3 identityHashCode is :"+System.identityHashCode(_Integer3)+"\n_Integer4 identityHashCode is :"+System.identityHashCode(_Integer4));        System.out.println("_Integer3==_Integer4 is : "+(_Integer3==_Integer4)+"\n");        Integer _Integer5 = int1;        Integer _Integer6 = int1;        System.out.println("_Integer5 value is : "+_Integer5+"\n_Integer6 value is : "+_Integer6);        System.out.println("_Integer5 identityHashCode is :"+System.identityHashCode(_Integer5)+"\n_Integer6 identityHashCode is :"+System.identityHashCode(_Integer6));        System.out.println("_Integer5==_Integer6 is : "+(_Integer5==_Integer6)+"\n");        Integer _Integer7 = _Integer1;        Integer _Integer8 = _Integer1;        System.out.println("_Integer7 value is : "+_Integer7+"\n_Integer8 value is : "+_Integer8);        System.out.println("_Integer7 identityHashCode is :"+System.identityHashCode(_Integer7)+"\n_Integer8 identityHashCode is :"+System.identityHashCode(_Integer8));        System.out.println("_Integer7==_Integer8 is : "+(_Integer7==_Integer8)+"\n");        Integer _Integer9 = _Integer3;        Integer _Integer0 = _Integer3;        System.out.println("_Integer9 value is : "+_Integer9+"\n_Integer0 value is : "+_Integer0);        System.out.println("_Integer9 identityHashCode is :"+System.identityHashCode(_Integer9)+"\n_Integer0 identityHashCode is :"+System.identityHashCode(_Integer0));        System.out.println("_Integer9==_Integer0 is : "+(_Integer9==_Integer0)+"\n");    }}

 上例运行的结果,如下所示(每次运行identityHashCode都不同的哟):

"C:\Program Files\Java\jdk1.7.0_71\bin\java" -Didea.launcher.port=7536 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_71\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_71\jre\lib\rt.jar;D:\workspace_test\hello-world\out\production\hello-world;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.jd.test.equ.EquTestMainint1 value is : 9int2 value is : 9int1 identityHashCode is :1401482194int2 identityHashCode is :1401482194int1==int2 is : true_Integer1 value is : 9_Integer2 value is : 9_Integer1 identityHashCode is :1401482194_Integer2 identityHashCode is :1401482194_Integer1==_Integer2 is : true_Integer3 value is : 9_Integer4 value is : 9_Integer3 identityHashCode is :1110594262_Integer4 identityHashCode is :1977385357_Integer3==_Integer4 is : false_Integer5 value is : 9_Integer6 value is : 9_Integer5 identityHashCode is :1401482194_Integer6 identityHashCode is :1401482194_Integer5==_Integer6 is : true_Integer7 value is : 9_Integer8 value is : 9_Integer7 identityHashCode is :1401482194_Integer8 identityHashCode is :1401482194_Integer7==_Integer8 is : true_Integer9 value is : 9_Integer0 value is : 9_Integer9 identityHashCode is :1110594262_Integer0 identityHashCode is :1110594262_Integer9==_Integer0 is : true

 6:如上的代码,如果看完了,也理解了,基本上结论也出来了。(建议先看下)

      6-1:==是比较运算符,当是基本数据类型时,比较的是变量的值,当是其他类型的对象时,用它比较的是两个对象的引用地址值是否相等

      6-2:equals是一个方法,如果对应的类没有重现Object类的equals()方法,则和==是一样的作用

      6-3:identityHashCode更能间接的代表一个对象的引用地址值

      6-4:如果一个类没有重写Object类的hashCode方法那么hashCode和identityHashCode是一致的

      6-5:hashCode相等时使用==比较,不一定是true

      6-6:identityHashCode相等时使用==比较,一定是true

      6-7:hashCode相等时使用equals比较,也不一定是true(通常可认为是true,我们自己可以随便定义的)

      6-8:我们通常关心的是对象值是否相当(一个值或者多个值),所以对象之间的比较一定要使用equals方法,而非==

7:参看博文如下(观点一致,只是解释的思路或者栗子不同)

 

 

转载地址:http://zaxql.baihongyu.com/

你可能感兴趣的文章
Android 上的浏览器
查看>>
微信小程序获取用户手机号,服务器解码demo
查看>>
Mac常用软件大全, 6-18特惠 ,限时降价,需要的看看吧
查看>>
Netty实践:ChannelInboundHandlerAdapter与ChannelOutboundHandlerAdapter
查看>>
Go语言学习笔记四: 运算符
查看>>
windows mongodb最常用命令简单归纳
查看>>
JS执行模糊搜索
查看>>
C++11新特性
查看>>
PowerTeam--Alpha阶段个人贡献分及转会人员
查看>>
判断 checkbox 是否选中以及 设置checkbox选中
查看>>
测试Hadoop2.7.1
查看>>
zookeeper 安装 && 基础知识
查看>>
[LeetCode] Remove Nth Node From End of List
查看>>
switch语句的技巧
查看>>
FindFileByContent
查看>>
抽象类和接口的区别——很深入的一篇文章
查看>>
小光棍数
查看>>
HDU3480:Division——题解
查看>>
HTTP头部和正文
查看>>
BZOJ - 3307: 雨天的尾巴
查看>>