Java中equals()和==号的区别

本文详细解析了Java中==与equals的区别,包括基本数据类型和引用类型的情况,并通过Integer与String类的具体示例说明了两者在实际应用中的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天使用==和equals在比较字符串的时候遇到了问题,所以总结了一下比较时使用==和equals的区别,如下:

  • 对于基本数据类型:
    ①==的使用:只是比较基本数据类型的值,如下:
int num1 = 12;
int num2 = 13;
System.out.println(num1 == num2);//false
System.out.println(num1);//12
char num3 = 'a';
char num4 = 'a';
System.out.println(num3 ==  num4);//true
System.out.println(num3);//a
  • 对于引用类型:
    ①普通对象,使用==和使用equals效果相同,都是比较对象的地址值是否相同;
    因为每个对象都默认继承了Object类,而Object类中的equals()方法如下:
 public boolean equals(Object obj) {
        return (this == obj);
    }

例子如下:

Equals_MarkDistinction obj1 = new Equals_MarkDistinction();
Equals_MarkDistinction obj2 = new Equals_MarkDistinction();
System.out.println(obj1 == obj2);//false
System.out.println(obj1.equals(obj2));//false
        System.out.println(obj1);//com.day3.Equals_MarkDistinction@6a2ab65b
        System.out.println(obj2);//com.day3.Equals_MarkDistinction@1a2a46d1

②对于Integer、String、Date等类重写了equals方法,所以==和equals使用不同:==比较两个对象的地址值;equals是比较两个对象的值是否相等;

Integer类

Integer的equals重写了Object的equals方法,如下:

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

Integer例子如下:

Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);//true
System.out.println(num1.equals(num2));//true
System.out.println(num1);//12


Integer num3 = new Integer(12);
Integer num4 = new Integer(12);
System.out.println(num3 == num4);//false
System.out.println(num3.equals(num4));//true
System.out.println(num3);//12
System.out.println(num4);//12

String类

string类重写了Object的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;
    }

String类使用==和equals举例如下:

    String str1 = "aa";
    String str2 = "aa";
    System.out.println(str1 == str2);//true
    System.out.println(str1);//aa
    System.out.println(str2);//aa


    String str3 = new String("aa");
    String str4 = new String("aa");
    System.out.println(str3 == str4);//false
    System.out.println(str3.equals(str4));//true
    System.out.println(str3);//aa
    System.out.println(str4);//aa

    String str5 = new String();
    str5 = "aa";
    String str6 = new String();
    str6 = "aa";
    System.out.println(str5 == str6);//true
    System.out.println(str5.equals(str6));//true
    System.out.println(str5);//aa
    System.out.println(str6);//aa

String类的三种赋值方式内存如下:

这里写图片描述

主要知识点:

1.为什么Integer类和String类的对象打印出来是值,而一般的对象打印出来是一个物理地址,是应为要在控制台打印信息必须要调用toSting()方法,而Integer、String类重写了Object的toString()方法:

①String类的toString()方法如下:

 public String toString() {
        return this;
    }

②Integer的toSting()方法如下:

   public static String toString(int i, int radix) {

        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
            radix = 10;

        /* Use the faster version */
        if (radix == 10) {
            return toString(i);
        }

        char buf[] = new char[33];
        boolean negative = (i < 0);
        int charPos = 32;

        if (!negative) {
            i = -i;
        }

        while (i <= -radix) {
            buf[charPos--] = digits[-(i % radix)];
            i = i / radix;
        }
        buf[charPos] = digits[-i];

        if (negative) {
            buf[--charPos] = '-';
        }

        return new String(buf, charPos, (33 - charPos));
    }

③Object的toString()方法如下:

  public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雅静8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值