当前位置: 首页 > news >正文

==与equals()的区别

==与equals()的区别

对于==

  1. 比较的是值是否相等
  2. 如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
  3. 如果作用于引用类型的变量,则比较的是所指向的对象的地址

对于equals方法

  1. equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
  2. 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,默认也是==;
  3. 对于String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
  4. 具体要看自定义类(比如实体类等)里有没有重写Object的equals方法来判断
  5. 通常情况下,重写equals方法,会比较类中的相应属性是否都相等

重写equals()方法的原则
对称性: 如果x.equals(y)返回是“ true ”, 那么y.equals(x) 也应该返回是
“true”。
自反性:x.equals(x)必须返回是“true”。
传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,
那么z.equals(x)也应该返回是“true”。
一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你 重复x.equals(y)多少次,返回都是“true”。
任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

==的特点及使用

= =:

  • 基本类型比较值:只要两个变量的值相等,即为true。
  • 引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,= =才返回true。
  • 用“= =”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本 数据类型除外),否则编译出错
/* *  == 的使用:* == :运算符* 1. 可以使用在基本数据类型变量和引用数据类型变量中* 2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)*    如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体* 补充: == 符号使用时,必须保证符号左右两边的变量类型一致。*/
public class EqualsTest {public static void main(String[] args) {//基本数据类型int i = 10;int j = 10;double d = 10.0;System.out.println(i == j);//trueSystem.out.println(i == d);//trueboolean b = true;
//		System.out.println(i == b);char c = 10;System.out.println(i == c);//truechar c1 = 'A';char c2 = 65;System.out.println(c1 == c2);//true}
}

equals()的特点和使用

equals():

  • 所有类都继承了Object,也就获得了equals()方法。还可以重写。
  • 只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。
    格式:obj1.equals(obj2)
  • 特例:当用equals() 方法进行比较时, 对类File 、String 、Date 及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对 象;原因:在这些类中重写了Object类的equals()方法。
  • 当自定义使用equals()时,可以重写。用于比较两个对象的“内容”是否都
    相等
package com.atguigu.java1;
import java.util.Date;
/* * 二、equals()方法的使用:* 1. 是一个方法,而非运算符* 2. 只能适用于引用数据类型* 3. Object类中equals()的定义:*    public boolean equals(Object obj) {return (this == obj);}*    说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体* * 4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是*    两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。*    * 5. 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"实体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写.*    重写的原则:比较两个对象的实体内容是否相同.*/
public class EqualsTest {public static void main(String[] args) {	//引用类型:Customer cust1 = new Customer("Tom",21);Customer cust2 = new Customer("Tom",21);System.out.println(cust1 == cust2);//falseString str1 = new String("atguigu");String str2 = new String("atguigu");System.out.println(str1 == str2);//falseSystem.out.println("****************************");System.out.println(cust1.equals(cust2));//false--->true//调用Object类中定义的equals()和==的作用是相同的System.out.println(str1.equals(str2));//true//像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同。Date date1 = new Date(32432525324L);Date date2 = new Date(32432525324L);System.out.println(date1.equals(date2));//true			}
}

重写equals()

Object 的equals方法,本质为==

public boolean equals(Object obj) {return (this == obj);}

拿String重写的的equals进行举例
1.先判断引用地址是否相等,相等直接返回true
2.判断传入的anObject是否为String类型
3.向下转型,强转为String
4.得到长度n
5.拿长度n和传入形参anObject进行对比吗,不相同返回false
6.循环进行数组内数据的比较,相同返回true,否则返回false

public boolean equals(Object anObject) {//判断引用地址if (this == anObject) {return true;}if (anObject instanceof String) {//判断是否为String    //向下转型,强转为String//形参是anObject,实参是String类型,传入类型会自动类型提升,不强转的话,“编译”的时候点不出来String的结构//“运行”的时候,实际上anObject形参收到的是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;}
http://www.lryc.cn/news/5516.html

相关文章:

  • 【人工智能】对贝叶斯网络进行吉布斯采样
  • Java 面向对象基础
  • RocketMQ源码(21)—ConsumeMessageConcurrentlyService并发消费消息源码
  • 基于 STM32+FPGA 的多轴运动控制器的设计
  • 《爆肝整理》保姆级系列教程python接口自动化(十三)--cookie绕过验证码登录(详解
  • soapui + groovy 接口自动化测试
  • Linux内存管理(三十五):内存规整简介
  • Java连接Redis
  • Python语言零基础入门教程(十六)
  • SAP ERP系统SD模块常用增强之一:VA01/VA02创建或修改SO的输入检查
  • 深度学习知识补充
  • Vue笔记(1)——数据代理与绑定
  • LeetCode题目笔记——2563. 统计公平数对的数目
  • 【MySQL Shell】8.9.5 将集群重新加入到 InnoDB ClusterSet
  • 元素水平垂直居中的方法有哪些?如果元素不定宽高呢?
  • 访问学者在新加坡访学生活日常花销大吗?
  • XCP实战系列介绍11-几个常用的XCP命令解析
  • 全志V853芯片 如何在Tina V85x平台切换sensor?
  • 2023全网最火的接口自动化测试,一看就会
  • 华为OD机试真题JAVA实现【最小传递延迟】真题+解题思路+代码(20222023)
  • Transformer
  • 并发包工具之 批量处理任务 CompletionService(异步)、CompletableFuture(回调)
  • 验收测试分类
  • 因新硬件支持内核问题Ubuntu 22.04.2推迟发布
  • agent扩展-自定义外部加载路径
  • Elasticsearch使用篇 - 指标聚合
  • Python生命周期及内存管理
  • Elasticsearch7.8.0版本进阶——数据写流程
  • 化学试剂Glutaric Acid-PEG-Glutaric Acid,GA-PEG-GA,戊二酸-聚乙二醇-戊二酸
  • 知识图谱业务落地技术推荐之国内知识图谱平台汇总(竞品)[阿里、腾讯、华为等】