侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

java中关于==和equals的分析

Java  /  管理员 发布于 8年前   282

==的分析

1、对于基本数据类型,比较的是他们的具体内容是不是一样,跟他们的内存地址无关。

举个例子:

public class Test{public static void main(String[] args) {int i = 10;double j = 10.0;float m = 10.0f;char k = 10;boolean b = true;System.out.println(i == j);System.out.println(i == m);System.out.println(m == k);System.out.println("*******************");//System.out.println(i == b);  很明显,布尔型不能和其他基本数据类型比较,编译报错.System.out.println(System.identityHashCode(i));System.out.println(System.identityHashCode(j));System.out.println(System.identityHashCode(m));System.out.println(System.identityHashCode(k));System.out.println(System.identityHashCode(b));}}

输出:

truetruetrue*******************366712642182916470020186995541311053135118352462

相关视频教程推荐:java免费视频教程

分析:

①根据比较的结果和内存地址来看,内容一样,内存地址不一样,但是返回的结果都是true,说明比较的 时候只看变量中存储的内容是否相同,而跟内存地址无关。

②==比较的两边数据需要能强制转换成同一类型,比如int和double的比较,会强制转换到double。

③布尔类型不能和int,float,double,char等基本数据类型做比较,编译时就报错。

2、对于引用数据类型的比较:

public class Test{public static void main(String[] args) {Test t1 = new Test();Test t2 = new Test();        String name1 = "琼宝";String name2 = "琼宝";System.out.println(name1 == name2); // trueSystem.out.println(System.identityHashCode(name1)); //366712642System.out.println(System.identityHashCode(name2)); //366712642System.out.println(t1 == t2);     //falseSystem.out.println(System.identityHashCode(t1));          //366712642System.out.println(System.identityHashCode(t2));          //1829164700        System.out.println(System.identityHashCode(new Test()));  //2018699554System.out.println(System.identityHashCode(new Test()));  //1311053135        System.out.println(new Test() == new Test());}}

输出:

true366712642366712642false366712642182916470020186995541311053135false

分析:

①对于引用数据类型,此时涉及到两块内存的问题, 而且比较的也是内存地址是否相同,比如执行语句:

Test t1 = new Test() Test t2 = new Test()时,会开辟两块内存,一块用于储存t1 t2 ,一 块用于储存两个 new Test()。而很明显的是,t1和t2的内存地址不一样,就连两个new Test()的地 址都不一样,所以此时用==来比较的时候,结果必然是false.

(补充:t1和t2中存储的其实是new Test() 对象使用的内存的首地址。)

②对于String类型来说,内容相同的时候,其内存地址也相同,比较的时候看的也是地址。

如果要比较对象中存储的内容是否相同(不是比较地址),那么==就无法实现,此时需要equals。

equals的分析

1、先看一个equals比较的例子:

public class TestEquals {public static void main(String[] args) {TestEquals t1 = new TestEquals();TestEquals t2 = new TestEquals();System.out.println(t1.equals(t2));  //falseString s1 = new String();String s2 = new String();        System.out.println(System.identityHashCode(s1));System.out.println(System.identityHashCode(s2));System.out.println(System.identityHashCode(new String()));System.out.println(System.identityHashCode(new String()));        System.out.println(s1.equals(s2));  // true}}输出结果:false366712642182916470020186995541311053135true

2、分析:

①t1和t2的比较是false,而s1和s2的比较是true,这里就涉及到了equals方法的重写问题,先看 Object类 中equals的源码:

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

② 对于s1.equals(s2) ,this就是s1,obj是s2,而源码中的比较用的是==,很明显是引用数据类型的比 较,看的是s1和s2的内存地址,上面的分析已经知道他们的地址不一样,所以结果自然就是false.

③而s1和s2的比较结果是true,这是因为在String类中,equals方法被重写了,看源码:

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;    }

④通过和object中equals源码的对比可以看出,String中的equals方法比较的不再是对象的地址,而是看 两个对象内容,或者两个对象的属性是否都一样。

⑤像String,Date,File…等类都对equals方法进行了重写。

总结:

1.==用于比较基本数据类型时,比较的是内容是否相等,比较引用数据类型时,看的是内存地址是否相等。

2.equals只能比较引用数据类型(对象),没被重写之前,使用==来比较内存地址,重写后比较的是对象的具 体内容和属性是否一致。

更多相关文章教程请访问:java编程入门

以上就是java中关于==和equals的分析的详细内容,更多请关注其它相关文章!


  • 上一条:
    深入学习java之transient关键字
    下一条:
    详解java中的BufferedReader类
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在java中实现的脱敏工具类代码示例分享(0个评论)
    • zookeeper安装流程步骤(0个评论)
    • 在java中你背的“八股文”可能已经过时了(2个评论)
    • 在php8.0+版本中使用属性来增加值代码示例(3个评论)
    • java 正则表达式基础,实例学习资料收集大全 原创(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2018-03
    • 2020-03
    • 2023-05
    • 2023-11
    • 2024-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客