【Java】关于equals 和 ==

一、== 和 equals 区别

==

== 是运算符;

判读左右两端的数据是否一致, 比较基本数据类型比较的是值,比较引用数据类型比较的是地址值 ;

默认判断的是两个对象的内存地址是否一致,一般用在基本数据类型上

equals

equals 是object类提供的一个方法,用来判断两个对象是否相等

Object中的equals用的是== (地址值),重写之后的equals方法一般比较内容

Object中的equals长这样: ​

java 复制代码
public boolean equals(Object obj) { ​ 
    return (this == obj); ​ 
}

字符串String也重写了equals方法,判断两个字符串的内容是否一致

可以通过重写equals方法,不让它只是比较地址值/或者内容,比如也可以比较两个类的某一个属性,比如猫的花色,例子如下:

java 复制代码
public class Cats {
    String name;
    String color;

    public Cats(String name, String color) {
        this.name = name;
        this.color = color;
    }

    public boolean equals(Cats c){
        if(this.color == c.color){//单纯的自己去写判断的逻辑
            return true;
        }else
            return false;
    }

    public static void main(String[] args) {
        Cats c1 = new Cats("小花","红色");
        Cats c2 = new Cats("小花","红色");
       // System.out.println(c1 == c2);//false 默认判断的是两个对象的内存地址是否一致,一般用在基本数据类型上
       // System.out.println(c1.equals(c2));//false 默认调用的是object提供的equals方法
        //object中的equals长这样:
        //public boolean equals(Object obj) {
        //        return (this == obj);
        //    }
        System.out.println(c1.equals(c2));//得到的是true,此时调用的是子类中的equals方法
    }
}

举例:

java 复制代码
public class Test { 
    public static void main(String[] args) {
        String a1 = "竹鼠";
        String a2 = "竹鼠";//第二次的竹鼠,并没有单独占用内存空间
        System.out.println(a1 == a2); // true
        System.out.println(a1.equals(a2)); // true
        
        String a3 = new String("钢精");//这一句话创建了两个对象,一个是字符串对象"钢精",一个是new的对象
        String a4 = new String("钢精");
        System.out.println(a3 == a4); // false
        System.out.println(a3.equals(a4)); // true
        }
}

因为字符串是我们使用频率最高的一种数据类型. java会自动帮我们对字符串进行缓存. 发现一样的字符串了就不再创建新的了. 所以a1和a2内存地址是一样的. 所以两个都是true.

a3在创建的时候new了一次. a4也new了一次. 此时, "钢精" 三个字被缓存. 但是. new的时候是要创建对象的. 对象再引入"钢精"三个字. 所以. 两个对象的地址是不一样的. 但是内容是一样的.

综上, 我们在判断两个字符串是否一致的时候, 一定要用equals 这样就是很稳定的判断内容是否一样.

二、关于equals顺序

如果用type.equals(Chrome) 可能会空指针错误

因为type是string 引用数据类型,就有可能会传null进来

所以如果是null.equals(Chrome)会报空指针;

反之,如果是"chrome".equals(null)这样是不会报空指针的

相关推荐
点云SLAM3 分钟前
C++中string流知识详解和示例
开发语言·c++·istringstream·ostringstream·c++学习·stringstream·数据流操作
甜甜的资料库7 分钟前
基于微信小程序的作业管理系统源码数据库文档
java·数据库·微信小程序·小程序
有梦想的骇客6 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
yours_Gabriel6 小时前
【java面试】微服务篇
java·微服务·中间件·面试·kafka·rabbitmq
门前云梦8 小时前
《C语言·源初法典》---C语言基础(上)
c语言·开发语言·学习
hashiqimiya8 小时前
android studio中修改java逻辑对应配置的xml文件
xml·java·android studio
liuzhenghua668 小时前
Python任务调度模型
java·运维·python
結城8 小时前
mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
java·spring boot·后端
小前端大牛马8 小时前
java教程笔记(十一)-泛型
java·笔记·python
sjtu_cjs8 小时前
Tensorrt python api 10.11.0笔记
开发语言·笔记·python