2.== 和 equals 的区别是什么?

news/2025/2/21 2:49:01/

== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

  1. 基本类型:比较的是值是否相同;
  2. 引用类型:比较的是引用是否相同;

代码示例:

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat {public Cat(String name) {this.name = name;}private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

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

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 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 重写了 Object 的 equals 方法,把引用比较改成了值比较。

总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。


http://www.ppmy.cn/news/96426.html

相关文章

服务器上的项目从Gitee上拉取,并且避免重新安装依赖

如果您已经在本地电脑上对项目进行了修改并将其同步到了Gitee上,现在希望将服务器上的文件与Gitee同步,并且避免重新安装依赖,您可以按照以下步骤进行操作: 1. 在服务器上,进入Flask项目的目录。您可以使用命令行终端…

curl 工具的使用

curl是Linux下的命令行工具,用于传输数据。它支持多种网络协议,可以轻松抓取URL、上传文件等。 curl的基本语法是: curl [选项] [URL]常用的选项有: -X :指定请求方法,如GET, POST, PUT等-d :发送POST请求的数据,字符串形式-H :添加请求头-u :用户名和密码-b :使用cookie信息…

Linux-0.11 文件系统pipe.c详解

Linux-0.11 文件系统pipe.c详解 模块简介 在Linux-0.11中提供了管道这种进程间通讯的方式。本程序包含了管道文件读写操作函数read_pipe()和write_pipe()。 函数详解 read_pipe int read_pipe(struct m_inode * inode, char * buf, int count)该函数是读管道的方法。 函数…

第4章 Container

第4章 Container reference 引用 Declaring references Reference is a new way to manipulate objects in C – char c; // a character – char* p &c; // a pointer to a character – char &r c; // a reference to a character 区分指针*: int* p &…

C#调用FreeSpire.PDF获取PDF文档中使用的字体

除了图片之外,电子文件中使用的字体都必须要在本机中安装才能正常查看文字(word缺少字体的话会自动使用相似或默认字体),要想知道电子文件中使用的字体,可以将电子文件转换为PDF文件(如果是打印成PDF的话&a…

C++环形缓冲区设计与实现:从原理到应用的全方位解析

C环形缓冲区设计与实现:从原理到应用的全方位解析 一、环形缓冲区基础理论解析(Basic Theory of Circular Buffer)1.1 环形缓冲区的定义与作用(Definition and Function of Circular Buffer)1.2 环形缓冲区的基本原理&…

Visual Studio2022编译器实用调试技巧

目录 1.什么是bug 2.调试是什么? 3.debug和release的介绍 4.windows环境调试介绍 4.1 调试环境的准备 4.2 学会快捷键 4.3 调试的时候查看程序当前信息 4.4 查看内存信息 5.如果写出好(易于调试)的代码 7.编程常见的错误 1.什么是b…

Day2:Windows网络编程-TCP

今天开始进入Windows网络编程的学习,在学习的时候总是陷入Windows复杂的参数,纠结于这些。从老师的讲解中,这些内容属于是定式,主要学习写的逻辑。给自己提个醒,要把精力放在正确的位置,不要无端耗费精力。…