Java中 详细讲解 ==与equals的区别对比

java == 与 equals 的对比

== 是一比较运算符

  1. 既可以判断基本类型,又可以判断引用类型。
  2. 如果判断基本类型,判断的是值是否相等。
ini 复制代码
   
    int x = 80;
    double y = 80.0;
    System.out.println(x==y); //true
  1. 如果判断引用类型,判断的是地址是否相等,既判断是不是同一个对象。
ini 复制代码
    A a = new A();
        A b = a;
        A c = b;
    System.out.println(b==c); //ture
    System.out.println(a==c); //ture
    B g = a;
    System.out.println(g==a); //ture


class B{ }
class A extends B{ }

equals 方法

  1. Object类中的方法,只能判断引用类型
typescript 复制代码
Object的 equals 源码
    
public boolean equals(Object anObject) {
    if (this == anObject) {   //如果是同一个对象
        return true;      //返回true
    }
}   


案例

     Cat cat1 = new Cat("小花",2);
     Cat cat2 = new Cat("小花",2);
     /*
      Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,**子类可
      以使用  Object 所有方法**。
     */
     System.out.println(cat1.equals(cat2));  //false   判断是不是同一个对象
    



class Cat{
    
    private String name;
    private int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  1. 默认判断的是地址是否相等,既判断是不是同一个对象。子类中往往重写该方法,用于判断内容是否相等。比如( String, Integer)
java 复制代码
//把object的equals方法重写了,变成了比较两个字符串值 是否相同
String类的 equals方法 源码

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; //如果两个字符串的所有字符都相等,则返回true
    }
}
return false; //如果比较的不是字符串,则直接返回false



案例一:


        Cat cat1 = new Cat("小花",2);
        Cat cat2 = new Cat("小花",2);
        System.out.println(cat1.equals(cat2));  //true
    



class Cat{

    private String name;
    private int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    //这里重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cat cat = (Cat) o;
        return age == cat.age &&
                Objects.equals(name, cat.name);
    }



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


案例二:


    String str1 = new String("好好学习");
    String str2 = new String("好好学习");
    System.out.println(str1.equals(str2)); //true



Integer 也重写了object的 equals 方法,变成了判断两个值是否相同

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



Integer integer1 = new Integer(1000);
Integer integer2 = new Integer(1000);
System.out.println(integer.equals(integer1)); //true 判断两个值是否相等
相关推荐
盖世英雄酱581361 小时前
Java 组长年终总结:靠 AI 提效 50%,25 年搞副业只赚 4k?
后端·程序员·trae
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue在线音乐播放系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
code bean2 小时前
Flask图片服务在不同网络接口下的路径解析问题及解决方案
后端·python·flask
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
努力的小郑2 小时前
2025年度总结:当我在 Cursor 里敲下 Tab 的那一刻,我知道时代变了
前端·后端·ai编程
颜淡慕潇4 小时前
深度解析官方 Spring Boot 稳定版本及 JDK 配套策略
java·后端·架构
Victor3564 小时前
Hibernate(28)Hibernate的级联操作是什么?
后端
Victor3564 小时前
Hibernate(27)Hibernate的查询策略是什么?
后端
superman超哥5 小时前
Rust 内部可变性模式:突破借用规则的受控机制
开发语言·后端·rust·rust内部可变性·借用规则·受控机制
柒.梧.5 小时前
Spring核心知识全解析:从入门实战到进阶
java·后端·spring