Java 中的比较 equals 和 ==

这篇具有很好参考价值的文章主要介绍了Java 中的比较 equals 和 ==。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个问题在 Java 面试的时候大概率会被问到。

不是因为这个问题有什么复杂的,只是因为这个地方超出人类认知,你相信吗?

比较什么

如果你上培训班或者在学校学习的话,你的老师大概率可能会告诉你对于:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

本来这里就有点复杂了,还非要搞出另外 2 个概念。

比较好记的就是 == 比较的是内存地址,equals 比较的是具体的值。

Java 中的比较 equals 和 ==,java,开发语言

对上面的问题,所谓的基本类型,因为没有对象话,所以 JVM 没有为基本类型创建实例化后的对象,因此 == 就可以直接用了,因为 2 个相同的基本类型的值的地址是一样的。

String 为什么不行

String 在 Java 里面有点奇葩,因为 String 是在是用得太多了。

所以 Java 为 String 搞了一个 String Pool,对于程序中,你这样定义的字符 String s1 = "iSharkFly";这个数据是存储在 String Pool 里面的。

因为 String 在 Java 里面被定义为不可变。等下一次你定义一个 s2 的时候,如果是同样的值, s1 和 s2 是相同的,因为都在 String Pool 里面。

String 还有另外一个初始化方法:` String s1 = new String(“iSharkFly”);

这个方法初始化的 String 是一个对象,这个对象没有放在 String Pool 里面,这个对象在 Heap 内存中。

所以:

        String s1 = new String("iSharkFly"); 
        String s2 = new String("iSharkFly");

的内存地址是不相同的,但是值相同。

使用 == 比较,上面就没有办法比较。

查看下面的代码:

        String s1 = new String("iSharkFly");
        String s2 = new String("iSharkFly");
        log.debug("hashCode - {}", s1.hashCode());
        log.debug("hashCode- {}", s2.hashCode());
        log.debug("identityHashCode- {}", System.identityHashCode(s1));
        log.debug("identityHashCode - {}", System.identityHashCode(s2));

程序输出:

Java 中的比较 equals 和 ==,java,开发语言

我们会看到地址是不相同的。

hashCode

都知道 hashCode 会返回对象的 HashCode 来识别对象,为什么上面的地址是一样的?

因为 hashCode 会在程序中被重写。

下面的是 String 的 HashCode 代码。

Java 中的比较 equals 和 ==,java,开发语言

JDK 已经对代码进行了重写。所以 hashCode 并不能完全标识内存地址

所以,我们只能使用 System.identityHashCode 方法来获得内存地址。

总结

equals 和 == 在 Java 面试中经常会遇到。

只需要记住的是 == 比较的是内存地址,在对值进行比较的时候并不可靠。

在实际编码过程中,这种比较也比较常见的,所以还是有必要了解下这个。

Java 中的比较 equals 和 == - Java - iSharkFly文章来源地址https://www.toymoban.com/news/detail-707380.html

到了这里,关于Java 中的比较 equals 和 ==的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文详解java中的==和equals()

    目录 一、\\\"==\\\"运算符 二、\\\"equals()\\\"方法 三、举例说明和解释 3.1、例子 3.2、基本数据类型的比较 3.3、引用数据类型的比较     3.3.1 String类     3.3.2 未重写equals方法的类 四、为什么重写equals方法就一定要重写hashCode方法  4.1 为什么要重写equals方法 4.2 hashCode 4.3 为什么equas和ha

    2024年02月04日
    浏览(66)
  • Java中的equals和hashCode

    目录 equals hashCode equals和hashCode之间的关系 总结 equals方法是Object类中用于检测两个对象是否相同的方法,Object类中实现的是两个对象引用是否相同的方法,看以下Object类中代码: 可以看出来,Object类中equals方法本质上比较的还是两个对象的引用是否相同。也就是比较一个对象

    2024年02月06日
    浏览(76)
  • Java与Python、Node.js在人工智能和区块链应用程序开发中的比较

    背景 Java、Python和Node.js都是常用的编程语言,它们在不同领域都有广泛的应用。在人工智能和区块链应用程序开发中,这三种语言都具有各自的优势和劣势。 Java的优势 Java在企业级应用中应用广泛,这得益于其跨平台性、安全性和稳定性等特点。在人工智能和区块链应用程序

    2024年02月16日
    浏览(53)
  • JAVA语言-比较器Comparator

    目录 一、什么是Comparator 二、Java compare方法和compareTo方法 三、java中Comparable和Comparator的区别 Comparator的例子 Comparator 是javase中的接口,位于java.util包下。 数组工具类和集合工具类中提供的工具方法sort方法都给出了含有Comparator接口的重载方法。 List实例调sort方法 demo如下: 使

    2024年02月06日
    浏览(47)
  • Java中的锁:类型,比较,升级与降级

    在Java中,锁是一种用于实现并发控制的重要工具。在多线程环境中,锁可以确保数据的一致性和完整性。Java提供了多种类型的锁,包括内置的synchronized,ReentrantLock类以及更高级的并发工具,如StampedLock和ReadWriteLock。本文将详细介绍这些锁,比较它们的特性,并讨论锁

    2024年02月08日
    浏览(39)
  • Java中的比较器(Comparator)

    Java中的比较器(Comparator)是一种对象,用于定义两个对象之间的比较规则。它是一个独立的类,实现了Comparator接口,通常用于对集合中的元素进行排序。Comparator接口中有一个compare()方法,它接受两个对象作为参数,并返回一个int值,表示它们的顺序。 下面是一个简单的例

    2024年02月11日
    浏览(48)
  • Java 与其他编程语言的深入比较

    Java 是一种广泛使用的编程语言,它具有广泛的应用领域,例如 Web 开发、移动应用开发、桌面应用开发、游戏开发等。与其他编程语言相比,Java 具有以下优点: 跨平台性:Java 是一种跨平台的语言,因为它的代码可以被编译成字节码,然后在 Java 虚拟机 (JVM) 上运行。这使得

    2024年02月01日
    浏览(46)
  • Java语言:字符型的详解、字符串的比较

    目录 前言 一.字符型的知识 二.字符型比较大小 三.字符串比较 equals()方法 equalslgnoreCase()方法 compareTo() 方法 🎁博主介绍:博客名为tq02,已学C语言、JavaSE,目前学了MySQL和JavaWeb 🎥学习专栏:  C语言         JavaSE       MySQL基础 🎄博主链接:tq02的博客_CSDN博客-C语言,Ja

    2024年02月13日
    浏览(77)
  • [开发|java] java 比较两个对象的指定属性的值是否相等

    Java中比较两个对象的指定属性的值是否相等,可以使用Apache Commons Lang库中的EqualsBuilder类。EqualsBuilder提供了一种便捷的方法来比较两个对象的属性值是否相等,具体步骤如下: 通过构造器创建一个EqualsBuilder对象。 调用EqualsBuilder对象的append方法,传入需要比较的两个对象以

    2024年02月16日
    浏览(58)
  • 【笔记】语言实例比较 2. 两数之和 C++ Rust Java Python

    语言实例比较 2. 两数之和 C++ Rust Java Python 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会

    2024年01月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包