Java中==和equals的区别,包装类对比、String和new String

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

        对于这个问题,我们得了解基本类型和引用类型在内存中的结构,具体如下:

引用对象句柄访问:

Java中==和equals的区别,包装类对比、String和new String

引用对象直接指针访问:

 Java中==和equals的区别,包装类对比、String和new String

        可以看出,无论哪种方式访问基本类型和引用类型的实例数据,基本类型的内存上是保存值,而引用类型的内存上是保存指针(地址)。

        == 可以理解为比较图中栈内存的数据。所以基本类型就是比较值,引用类型就是比较地址。

        equals是个方法,只有引用类型才能调用,基础类型如int等是无法调用的。该方法在Object中就存在,实际就是调用 == 来比较,代码如下:

 Java中==和equals的区别,包装类对比、String和new String

         若equals不重写的话,效果等同于==,只不过equals只能被引用类型调用,==可以被所有类型数据调用。

        另外,==判断是有特殊情况的,基础类型的包装类和String就有些情况就不是对比地址了,虽然它们是引用类型。具体比较如下图:

Java中==和equals的区别,包装类对比、String和new String

        这里可以看到 包装类比如 Integer不用new声明,==判断就是值判断,因为JVM不会创建Integer对象,会直接在常量池创建变量;若用new 声明,则==判断是引用判断,因为JVM会创建Integer对象,声明的变量存储的是Integer实例在堆中的地址。

        int i = 1和Integer j = 1的 i和j都是在常量池中保存值1,所以两个相等。而Integer h = new Integer(1)会在堆中新建Integer(1)对象,h在常量池中保存Integer(1)对象的地址,所以j==h进行常量池数据比较为false。

        String不用new声明,首先会在常量池中找字符串值,若有则该变量保存的是这个字符串值的地址,若没有找到字符串值,则在常量池中声明新字符串,此时该变量保存的是常量池中新字符串的地址。若用new声明,则直接新建字符串对象,变量为字符串在堆中的地址。

        String x="a"会在常量池中新建字符串"a",然后x保存"a"的地址。String y="a"会因为常量池中存在"a"(x声明的"a"),所以y也直接保存"a"的地址,所以x==y是true。而String z = "ab"和String n = new String("ab")分别会在常量池和堆中新建字符串"ab"并保存它们的地址,这里由于地址一个指向常量池,一个指向堆,显然z和n不等。另外实测 z=="a"+"b"和z!=x+"b",直接固定字符串相加则是常量池查找新建字符串,而有变量参与相加则是堆新建字符串。文章来源地址https://www.toymoban.com/news/detail-515649.html

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

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

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

相关文章

  • 【JAVA基础】== 与 equals区别

    它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型 比较的是值,引用数据类型 比较的是内存地址)。 基本数据类型 :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。 引用数据类型 :

    2024年02月11日
    浏览(32)
  • JAVA中.equals()与 ==的区别

            “==”是 运算符 ,如果是基本数据类型,则比较 存储的值 ;如果是引用数据类型,则比较 所指向对象的地址值 。         equals是 Object的方法 ,比较的是 所指向的对象的地址值 ,一般情况下,重写之后比较的是 对象的值 。 八大数据类型: 整数 byte、sho

    2024年02月08日
    浏览(35)
  • Java 中 == 与 equals() 的区别

    2024年02月15日
    浏览(37)
  • 【Java扫盲篇】==和equals的区别

    这是一道面试经典题,面试官对你说:小伙子,请你说说 == 和 equals 的区别 对于==来说 如果比较的是基本数据类型,那么==比较的是数据的值是否相同。注意: (与数据类型无关) 如果比较的是引用数据类型,那么==比较的是两个对象的地址是否相同,即两个引用是否指向同

    2024年03月23日
    浏览(28)
  • Java中的String类的常用方法(对于字符串的常用操作)

    目录 一、获取指定索引的字符 二、 获取指定字符或者字符串的索引位置 三、判断字符串是否以指定内容开头或结尾 四、替换指定的字符或者是字符串 五、获取字符串的子串 六、将字符串转换为字符数组  七、比较字符串的内容是否相等  八、连接字符串 九、比较两个字

    2024年02月20日
    浏览(65)
  • Java面试题: == 和 equals() 区别,toString方法

    == :运算符 可以使用在基本数据类型变量和引用数据类型变量中 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同) 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体 补充: == 符

    2024年02月08日
    浏览(42)
  • Java List toArray(new String[0]) 的理解&List的toArray()方法详解

    1、ArrayList的toArray ArrayList提供了一个将List转为数组的一个非常方便的方法toArray。toArray有两个重载的方法: (1)list.toArray(); (2)list.toArray(T[] a); 不明真像的同学喜欢用第一个,是这样写: 结果一运行,报错: 原因一看就知道了,不能将Object[] 转化为String[],转化的话只能

    2024年02月07日
    浏览(49)
  • C++的new与JAVA中new的区别

    ·C++的 new 和Java的 new 在语义上有一些区别,下面是它们之间的区别: 内存管理: C++中的 new 用于动态分配内存,并返回指向该内存的指针。需要手动使用 delete 释放内存,否则会导致内存泄漏。 Java中的 new 同样用于动态分配内存,但是垃圾回收器负责自动释放

    2024年02月11日
    浏览(29)
  • int和Integer的区别,Java为什么要设计包装类呢?

    1.默认值不同 作为成员变量来说,int的初始默认值为 0 ,而Integer为 null 。 2.存储的内存位置不同 Integer是一个类,其对象存储在 堆 内,int是基本数据类型,存放在 栈 中。 3.作用不同 Integer类里面封装了很多的属性以及方法,使用起来会更加的 灵活 。 Java为什么要设计基本类

    2024年02月13日
    浏览(43)
  • 6.6---每天一点点--- Java基础之==和equals区别并举例说明(总复习+深入版)---详细+举例(小白也能看懂)

    1.== 为运算符,equal 为String数据类型的比较方法 相同内容的对象地址不一定相同,但相相同地址的对象内容一定相同;== 比较的是值是否相等,equal比较的是是否是同一个对象 2.把对象想象成一个房子,而引用则是门牌号。如果两个引用指向同一个房子,那么它们就是相等的

    2024年02月08日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包