【JAVA基础】== 与 equals区别

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

==介绍

它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是内存地址)。

  • 基本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
  • 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。

举个例子:

public static void main(String[] args) {

    int i = 100;//基本数据类型
    int ii = 100;//基本数据类型
    Integer j = 100;//引用类型
    Integer jj = 100;//引用类型
    Integer k = new Integer(100);//引用类型
    Integer kk = new Integer(100);//引用类型
    System.out.println("i的地址:" + System.identityHashCode(i));
    System.out.println("ii的地址:" + System.identityHashCode(ii));
    System.out.println("j的地址:" + System.identityHashCode(j));
    System.out.println("jj的地址:" + System.identityHashCode(jj));
    System.out.println("k的地址:" + System.identityHashCode(k));
    System.out.println("kk的地址:" + System.identityHashCode(kk));

    //基本类型相互比较其中的值,所以得出true
    System.out.println("i == ii 结果:" + (i == ii));
    //当int的引用类型Integer与基本类型进行比较的时候,包装类会先进行自动拆箱
    //然后与基本类型进行值比较,所有得出true
    System.out.println("i == j 结果:" + (i == j));
    //同上,包装类先拆箱成基本类型,然后比较,得出true
    System.out.println("i == k 结果:" + (i == k));
    //都是引用类型,所有比较的是地址,因为j与jj的地址相同,得出true
    System.out.println("j == jj 结果:" + (j == jj));
    //都是引用类型,所有比较的是地址,因为k与kk的地址不相同,得出false
    System.out.println("k == kk 结果:" + (k == kk));
}

输出结果:

i的地址:713338599
ii的地址:713338599
j的地址:713338599
jj的地址:713338599
k的地址:168423058
kk的地址:821270929
i == ii 结果:true
i == j 结果:true
i == k 结果:true
j == jj 结果:true
k == kk 结果:false

疑问点:为什么 j 和 jj 的地址是一样的,k 与 kk 的地址却不一样呢?

答案:在-128~127的Integer值并且以Integer x = value;的方式赋值的参数,x会从包装类型自动拆箱成基本数据类型,以供重用!所以 j、jj 的内存地址都是一样的!

下面我们把100变成1000试试!

public static void main(String[] args) {

    int i = 1000;//基本数据类型
    int ii = 1000;//基本数据类型
    Integer j = 1000;//引用类型
    Integer jj = 1000;//引用类型
    Integer k = new Integer(1000);//引用类型
    Integer kk = new Integer(1000);//引用类型
    System.out.println("i的地址:" + System.identityHashCode(i));
    System.out.println("ii的地址:" + System.identityHashCode(ii));
    System.out.println("j的地址:" + System.identityHashCode(j));
    System.out.println("jj的地址:" + System.identityHashCode(jj));
    System.out.println("k的地址:" + System.identityHashCode(k));
    System.out.println("kk的地址:" + System.identityHashCode(kk));

    //基本类型相互比较其中的值,所以得出true
    System.out.println("i == ii 结果:" + (i == ii));
    //当int的引用类型Integer与基本类型进行比较的时候,包装类会先进行自动拆箱
    //然后与基本类型进行值比较,所有得出true
    System.out.println("i == j 结果:" + (i == j));
    //同上,包装类先拆箱成基本类型,然后比较,得出true
    System.out.println("i == k 结果:" + (i == k));
    //都是引用类型,所有比较的是地址,因为j与jj的地址不相同,得出false
    System.out.println("j == jj 结果:" + (j == jj));
    //都是引用类型,所有比较的是地址,因为k与kk的地址不相同,得出false
    System.out.println("k == kk 结果:" + (k == kk));
}

输出结果:

i的地址:713338599
ii的地址:168423058
j的地址:821270929
jj的地址:1160460865
k的地址:1247233941
kk的地址:258952499
i == ii 结果:true
i == j 结果:true
i == k 结果:true
j == jj 结果:false
k == kk 结果:false

当j、jj超出-128~127区间的时候,地址就变了,所以比较的结果就是false。 再看其它的包装器自动拆箱情况:

类型 描述
Boolean 全部自动拆箱
Byte 全部自动拆箱
Short -128~127区间自动拆箱
Integer -128~127区间自动拆箱
Long -128~127区间自动拆箱
Float 没有拆箱
Doulbe 没有拆箱
Character 0~127区间自动拆箱

equals()方法介绍

它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
  • 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

Boolean、Byte、Short、Integer、Long、Float、Doulbe、Character 8种基本类型的包装类都重写了 equals() 方法,所以比较的时候,如果内容相同,则返回 true,例如:

//因为内容相同,返回的都是true
System.out.println("j.equals(jj) 结果:" + (j.equals(jj)));
System.out.println("(k.equals(kk) 结果:" + (k.equals(kk)));

String类型的比较介绍

string是一个非常特殊的数据类型,它可以通过String x = value;的方式进行赋值,也可以通过String x = new String(value)方式进行赋值。

String x = value;方式赋予的参数,会放入常量池内存块区域中; String x = new String(value)方式赋予的参数,会放入堆内存区域中,当成对象处理。

举个例子:

public static void main(String[] args) {
    String a = new String("ab"); // a 为一个引用
    String b = new String("ab"); // b为另一个引用,对象的内容一样
    String aa = "ab"; // 放在常量池中
    String bb = "ab"; // 从常量池中查找
    System.out.println("a地址:" + System.identityHashCode(a));
    System.out.println("b地址:" + System.identityHashCode(b));
    System.out.println("aa地址:" + System.identityHashCode(aa));
    System.out.println("bb地址:" + System.identityHashCode(bb));
    //地址相同,所以返回true
    if (aa == bb) {
        System.out.println("aa==bb");
    }
    // 地址不同,非同一个对象,所以返回false
    if (a == b) {
        System.out.println("a==b");
    }
    //地址不同,但是内容相同,所以返回true
    if (a.equals(b)) {
        System.out.println("aEQb");
    }
}

输出结果:

a地址:713338599
b地址:168423058
aa地址:821270929
bb地址:821270929
aa==bb
aEQb

为什么string的equals()方法比较返回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;
}

如果内容相同,则返回true!

总结

如果需要比较某个对象是否相同,一定要重写equals(),比较其中的内容是否相同,如果相同,返回true;否则,返回false!文章来源地址https://www.toymoban.com/news/detail-507761.html

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

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

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

相关文章

  • 【Java扫盲篇】==和equals的区别

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

    2024年03月23日
    浏览(32)
  • Java面试题: == 和 equals() 区别,toString方法

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

    2024年02月08日
    浏览(47)
  • java 判断两个List是否包含 判断两个list相等

    java 判断两个List是否包含 判断两个list相等 https://blog.51cto.com/u_12855/7333853 1、直接使用equals()比较 众所周知,两个列表具有完全相同的元素并且具有完全相同的顺序时,它们是相等的。因此, 如果我们业务要求两个list顺序一致,可以使用equals()方法进行相等性检查: 即使

    2024年02月04日
    浏览(63)
  • Java中==和equals的区别,包装类对比、String和new String

            对于这个问题,我们得了解基本类型和引用类型在内存中的结构,具体如下: 引用对象句柄访问: 引用对象直接指针访问:           可以看出,无论哪种方式访问基本类型和引用类型的实例数据,基本类型的内存上是保存值,而引用类型的内存上是保存指针

    2024年02月11日
    浏览(40)
  • Java基础三(equals() & hashCode())

    等价关系 : 两个对象具有等价关系,需要满足以下五个条件: Ⅰ 自反性 : Ⅱ 对称性 : Ⅲ 传递性 Ⅳ 一致性 多次调用 equals() 方法结果不变 Ⅴ 与 null 的比较 对任何不是 null 的对象 x 调用 x.equals(null) 结果都为 false x.equals(null); // false; 等价与相等 对于 基本类型,“== ”判

    2023年04月23日
    浏览(26)
  • Java 判断两个IP段是否有交集

    一、背景介绍 在有些场景,需要判断IP段是否有交集,比如:配置一些设备的过滤规则,避免IP段重复配置,需要做IP段是否重叠的校验。 IP段有交集的场景有几种: 1)IP段1包含IP段2; 2)IP段2包含IP段1; 3)IP段1的起始IP与IP段2的结束IP相同,或者IP段1的结束IP与IP段2的起始

    2024年02月16日
    浏览(45)
  • Java基础09 —— 字符序列--String、StringBuilder、StringBuffer区别及其方法介绍

    字符与字符串 字符类型(char)是Java中的基本数据类型,占2个字节16位,默认值是 ‘u0000’ 。字符是用单引号引住的单个符号. 字符串(String)是用双引号引住的任意个字符,是引用数据类型,默认值是null 。字符串其实就是字符组成的序列 字符串声明 举例: 字符序列 多个字符

    2024年02月09日
    浏览(37)
  • 【python基础知识】python中怎么判断两个字符串是否相等

    目录 有哪些判断方法 1. == 运算符 2. is 运算符 有哪些特殊情况 1. 字符串中包含空格、换行符、制表符等特殊字符 2. 字符串编码格式的不同 3. 字符串对象的创建方式不同 注意事项 1. 避免使用is运算符进行字符串比较 2. 注意空格、换行符、制表符等特殊字符的影响 3. 注意字符

    2024年02月08日
    浏览(82)
  • Java判断两个集合是否具有交集以及如何获得交集

    全限定名为java.util.Collections,在俩个集合没有交集的时候会返回true,否则返回false。 比如: 结果: 全限定名为:org.apache.commons.collections.CollectionUtils,两个集合有交集会返回true,否则会返回false,跟Collections.disjoint相反。 例如: 结果: 全限定名为:cn.hutool.core.collection.Coll

    2024年02月06日
    浏览(50)
  • 【Java SE】判断两个文件内容是否相同的多种方法

    逐字节比较文件内容。这种方法适用于小文件,但对于大文件会比较耗时。 计算文件的哈希值(如 MD5、SHA-256 等),然后比较两个文件的哈希值。如果哈希值相同,则可以认为文件内容相同。这种方法适用于大文件,因为只需要比较哈希值而不是整个文件内容。 通过使用

    2024年02月07日
    浏览(71)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包