首页 Java java教程 浅谈 equals 和 == 的区别

浅谈 equals 和 == 的区别

Jun 23, 2017 pm 04:37 PM
equals 区别

在初学Java时,可能会经常碰到下面的代码:

 

1 String str1 = new String("hello");

2 String str2 = new String("hello");

3        

4 System.out.println(str1==str2);

5 System.out.println(str1.equals(str2));

 

为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些低级的错误。今天就来一起了解一下==和equals方法的区别之处。

 

一.关系操作符“==”到底比较的是什么?

 

下面这个句话是摘自《Java编程思想》一书中的原话:

 

“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。

 

这句话看似简单,理解起来还是需要细细体会的。说的简单点,==就是用来比较值是否相等。下面先看几个例子:

 

public class Main {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

 

        int n=3;

        int m=3;

 

        System.out.println(n==m);

 

        String str = new String("hello");

        String str1 = new String("hello");

        String str2 = new String("hello");

 

        System.out.println(str1==str2);

 

        str1 = str;

        str2 = str;

        System.out.println(str1==str2);

    }

 

}

 

输出结果为 true false true

 

n==m结果为true,这个很容易理解,变量n和变量m存储的值都为3,肯定是相等的。而为什么str1和str2两次比较的结果不同?要理解这个其实只需要理解基本数据类型变量和非基本数据类型变量的区别。

 

在Java中游8种基本数据类型:

 

  • 浮点型:float(4 byte), double(8 byte)

     

  • 整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)

     

  • 字符型: char(2 byte)

     

  • 布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值”true”和”false”)

 

对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的(char类型取值范围为0~2^16-1).

 

也就是说比如:

 

int n=3;

 

int m=3;

 

变量n和变量m都是直接存储的”3″这个数值,所以用==比较的时候结果是true。

 

而对于非基本数据类型的变量,在一些书籍中称作为 引用类型的变量。比如上面的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。比如下面这行代码:

 

String str1;

 

这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。

 

而 通过new String(“hello”)来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:

 

str1= new String("hello");

 

那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串”hello”。这里面的引用和C/C++中的指针很类似。

 

因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。

 

而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。

 

二.equals比较的又是什么?

 

equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用,直接看Object类中equals方法的实现。

 

该类的源码路径为:C:\Program Files\Java\jdk1.6.0_14的src.zip 的java.lang路径下的Object.java(视个人jdk安装路径而定)。

 

下面是Object类中equals方法的实现:

 

 

很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

 

但是有些朋友又会有疑问了,为什么下面一段代码的输出结果是true?

 

public class Main {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

 

        String str1 = new String("hello");

        String str2 = new String("hello");

 

        System.out.println(str1.equals(str2));

    }

}

 

要知道究竟,可以看一下String类的equals方法的具体实现,同样在该路径下,String.java为String类的实现。

 

下面是String类中equals方法的具体实现:

 

 

可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。

 

其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。

 

总结来说:

 

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

 

如果作用于引用类型的变量,则比较的是所指向的对象的地址

 

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

 

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

 

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

以上是浅谈 equals 和 == 的区别的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1659
14
CakePHP 教程
1416
52
Laravel 教程
1310
25
PHP教程
1258
29
C# 教程
1233
24
PS导出PDF如何设置密码保护 PS导出PDF如何设置密码保护 Apr 06, 2025 pm 04:45 PM

在 Photoshop 中导出带密码保护的 PDF:打开图像文件。点击“文件”>“导出”>“导出为 PDF”。设置“安全性”选项,两次输入相同的密码。点击“导出”生成 PDF 文件。

H5和小程序与APP的区别 H5和小程序与APP的区别 Apr 06, 2025 am 10:42 AM

H5、小程序和APP的主要区别在于:技术架构:H5基于网页技术,小程序和APP为独立应用程序。体验和功能:H5轻便易用,功能受限;小程序轻量级,交互性好;APP功能强大,体验流畅。兼容性:H5跨平台兼容,小程序和APP受平台限制。开发成本:H5开发成本低,小程序中等,APP最高。适用场景:H5适合信息展示,小程序适合轻量化应用,APP适合复杂功能应用。

在router文件夹下的index.js文件中为什么需要调用Vue.use(VueRouter)? 在router文件夹下的index.js文件中为什么需要调用Vue.use(VueRouter)? Apr 05, 2025 pm 01:03 PM

在router文件夹下的index.js文件中注册VueRouter的必要性在开发Vue应用程序时,常常会遇到关于路由配置的问题。特�...

centos和ubuntu的区别 centos和ubuntu的区别 Apr 14, 2025 pm 09:09 PM

CentOS 和 Ubuntu 的关键差异在于:起源(CentOS 源自 Red Hat,面向企业;Ubuntu 源自 Debian,面向个人)、包管理(CentOS 使用 yum,注重稳定;Ubuntu 使用 apt,更新频率高)、支持周期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社区支持(CentOS 侧重稳定,Ubuntu 提供广泛教程和文档)、用途(CentOS 偏向服务器,Ubuntu 适用于服务器和桌面),其他差异包括安装精简度(CentOS 精

不同数据库系统添加列的语法有什么区别 不同数据库系统添加列的语法有什么区别 Apr 09, 2025 pm 02:15 PM

不同数据库系统添加列的语法为:mysql:alter table table_name add column_name data_type; postgresql:alter table table_name添加column_name data_type; oracle; oracle:alter table table_name add(column_name data_type)

JavaScript中如何从指定DOM节点下使用XPath进行查找? JavaScript中如何从指定DOM节点下使用XPath进行查找? Apr 04, 2025 pm 11:15 PM

DOM节点下XPath查找方法详解在JavaScript中,我们经常需要根据XPath表达式从DOM树中查找特定的节点。如果需要从某�...

H5和小程序的推广方式有何不同 H5和小程序的推广方式有何不同 Apr 06, 2025 am 11:03 AM

H5与小程序的推广方式存在差异:平台依赖性:H5依赖浏览器,小程序依赖特定平台(如微信)。用户体验:H5体验较差,小程序提供类似原生应用的流畅体验。传播方式:H5通过链接传播,小程序通过平台分享或搜索。H5推广方式:社交分享、邮件营销、QR码、SEO、付费广告。小程序推广方式:平台推广、社交分享、线下推广、ASO、与其他平台合作。

c语言函数库在什么位置?c语言函数库怎么添加? c语言函数库在什么位置?c语言函数库怎么添加? Apr 03, 2025 pm 11:39 PM

C语言函数库是一个包含各种函数的工具箱,这些函数被组织在不同的库文件中。添加函数库需要通过编译器的命令行选项来指定,例如 GCC 编译器使用 -l 选项,后跟库名的缩写。如果库文件不在默认搜索路径下,则需要使用 -L 选项指定库文件路径。库有静态库和动态库之分,静态库在编译时直接链接到程序中,而动态库在运行时被加载。

See all articles