Java中==与equals的区别
Posted Ferron Zhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中==与equals的区别相关的知识,希望对你有一定的参考价值。
1、数据类型
谈论==
与equal
的区别之前,我们先来回顾一下Java中的基本数据类型和引用数据类型。
基本数据类型:Java中包括八种基本数据类型,分别为char,byte,short,int,long,float,double,boolean。
引用数据类型:引用类型包括三种,分别为类(class),接口(interface),数组(array),其中我们经常听到的Object,String,Date,Integer这些都属于类这种引用类型。
2、区别
- 如果是用于基本数据类型的比较,则只能用
==
,而不能用equals
,因为比较的数据类型是基本数据类型,它们没有equals()方法的实现,因此他们的比较只能用==
来实现,==
比较的是他们的值是否相等。 - 如果是用于引用数据类型的比较,不同情况下也有不同的结果。我们这里针对于类这种引用数据类型来说,所有的类都继承一个公共的父类
Object
,而该父类里面定义的比较方法为equals
。但是,Object
类里面的equals
方法默认比较的结果是内存地址,而不是值,因此该方法返回的结果与==
的结果相同。因此,这里判断==
与equals
的区别就变成了判断equals
的具体实现是否用==
来实现。- 拿
String
,Integer
,Date
这些类来说,这些类在继承了Object
之后,重写了父类的equals
方法,因此这些引用数据类型使用==
比较时,比较的是对象的内存地址,而使用equals
方法比较时,则比较的是对象的值。 - 对于
StringBuffer
或者一些自定义的类,这些类没有重写覆盖父类Object
的equals
方法,因此这些对象使用==
与equals
返回的结果是一样,因为equals
的实现方式就是使用==
来实现的。 - 还有一个关于
字符串缓冲池
的概念,程序会在运行的时候创建一个字符串缓冲池,来存放一些创建的字符串。如果你同时定义了两个相同的字符串,并且没有进行new操作,则在定义第二个字符串的时候,会将第二个字符串的内存地址指向第一个相同的字符串,而不会再创建一个新对象。此时==
与equals
操作返回结果相同;而当第二个字符串进行了new操作,创建第二个字符串时会新建一个字符串,此时==
与equals
返回的结果不相同。
- 拿
以上是关于Java中==与equals的区别的主要内容,如果未能解决你的问题,请参考以下文章
java中equals和equalsignorecase的区别