==与equals

场景

public static void main(String[] args) {

  String s1 = "hello";
    String s2 = "HELLO".toLowerCase();
    System.out.println(s1);
    System.out.println(s2);
    if (s1 == s2) {
      System.out.println("s1 == s2");
    } else {
      System.out.println("s1 != s2");
    }

}

image

image

public static void main(String[] args) {
   String s1 = "hello";
    String s2 = "HELLO".toLowerCase();
    System.out.println(s1);
    System.out.println(s2);
    if (s1.equals(s2)) {
      System.out.println("s1 equals s2");
    } else {
      System.out.println("s1 not equals s2");
    }
    }

image

image

使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。

==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现

字符串的对比使用equals()代替==操作符

以上就是关于equals方法和==操作符的区别,其主要的不同是一个是操作符一个是方法,==用于对比原生类型而equals()方法比较对象的相等性

==等号操作是什么

==”或等号操作在Java编程语言中是一个二元操作符,用于比较原生类型和对象。就原生类型如booleanintfloat来说,使用“==”来比较两者,这个很好掌握。但是在比较对象的时候,就会与equals()造成困惑。“==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指向同一个对象)时,“==”操作将返回true,否则返回false

什么是equals方法

equals()方法定义在Object类里面,根据具体的业务逻辑来定义该方法,用于检查两个对象的相等性。例如:两个Employees被认为是相等的如果他们有相同的empId的话,你可以在你自己的domain对象中重写equals方法用于比较哪两个对象相等。equals与hashcode是有契约的(无论什么时候你重写了equals方法,你同样要重写hashcode()方法),默认的equals方法实现是与“==”操作一样的,基于业务需求重写equals方法是最好的实践之一,同样equals与compareTo保持一致也不足为奇,以至于存储对象在Treemap或treeset集合中时,将使用compareTo方法检查相等性,行为是一致的。

==与equals的区别

我们先看Demo

String str = "abc";

String str1 = "abc";

String abc = new String("abc");

String abc1 = new String("abc");

然后我们使用==和equals挨个输出

System.out.println(str==str1);// true

System.out.println(abc==abc1);//false

这里 str==str1,结果为true,因为String str = "abc"在编译的时候,jvm将abc放入常量池,并在常量池中创建该常量的地址,然后将str去指向这个常量,当我们执行String str1 = "abc"的时候,会去常量池中寻找有没有abc这个常量,如果有,则将str1指向它,没有就创建,所以str1和str都指向常量池中的abc,故内存地址相同。

而在 String abc = new String("abc")中,首先会在堆内存中去开辟一个空间去存储abc,当我们再new对象的时候,还会再去开辟,所以二则的内存地址不相同,故返回false

然后再看equals输出:

 System.out.println(abc.equals(abc1));// true

 System.out.println(str.equals(abc));// true

当我们使用equals时,从上面讲的,可以知道abc与abc1,str与abc的内存地址并不相同,其在值上是相同的,那么可以得出结论equals会用==比较两个类型在内存中的地址一不一样,如果一样,则直接返回true,如果不一样,则直接往下走,再判断是否为string类型,如果不是,则强转为string类型,再将字符串数组拆分为单个字符,一一比较,有一个不相同,则返回false,否则返回true

总结:

==对于基本类型,比较的是值,但对于引用类型,比较的是内存地址

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;

  }

首先,equals会用==比较两个类型在内存中的地址一不一样,如果一样,则直接返回true,如果不一样,则直接往下走,再判断是否为string类型,如果不是,则强转为string类型,再将字符串数组拆分为单个字符,一一比较,有一个不相同,则返回false,否则返回true.

= =与equals的主要区别是:= =常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果= =和equals()用于比较对象,当两个引用地址相同,= =返回true。而equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。

拓展


jdk1.8中Integer类中的方法equals()比较的是值

当两个基本类型使用”==”比较时,他们比较的是值。

当两个引用类型使用”==”比较时,他们比较的是地址。

当两个引用类型使用方法equals()比较时,他们比较的是值。

当比较基本类型使用”==”和方法equals()比较时,他们比较的都是值。

posted @   忘崽牛仔  阅读(15)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示

目录导航