JAVA中的equals和==

本文详细解析了Java中基本数据类型与引用数据类型的区别,解释了==与equals方法的不同之处,包括它们如何应用于基本类型与引用类型变量,并通过具体示例说明了String类对equals方法的重写。

首先我们 先看一下运行的代码,如图:
这里写图片描述

可以看到输出结果为 true false true

那么问题来了!

一、首先第一个问题,a==b 运行结果是true ,而str1 == str 2 运行结果是false呢???

首先我们要明白基本数据类型变量和非基本数据类型变量的区别(也叫引用数据类型)。

1、基本数据类型:

byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0

short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0

int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0

long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L

float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0

double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0

char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空

boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

2、引用数据类型:

类、接口类型、数组类型、枚举类型、注解类型。

区别:

基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。

引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。

那么再次回到我们刚才的问题

a == b
经过上面的分析我们知道了对8种基本数据类型,变量值存的是值,而用 == 比较的时候,比较的是值本身,a存的是1 , b存的是1 ,所以用 == 比较的结果是true。

str1 == str2
str1是引用数据类型,所以存的不是值而是对象中的地址,所以用 == 比较的时候它们分别指向不同的对象,也就是说它们实际存储的内存地址不同。所以返回的当然是false了。

二、那么第二个问题来了str1.equals(str2)为什么是true呢???
 equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用,直接看Object类中equals方法的源码。
 这里写图片描述
 
很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

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

那是因为String重写了equals方法,下面是String 重写equals方法
这里写图片描述

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

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

总结来说:

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

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

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

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

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

可能有些小白会有疑问 为什么int不能用equals呢??
答:
int是基本类型,不是对象,没有方法;
string是对象

通俗简单来说就是 男人能生小孩吗???

Java 中,`equals` 方法 `==` 运算符都用于比较,但它们存在本质区别,下面从不同方面详细介绍: ### `==` 运算符 - **基本数据类型的比较**:当 `==` 用于基本数据类型(如 `int`、`double`、`char` 等)时,比较的是它们的值是否相等。例如,`int a = 5; int b = 5;`,使用 `a == b` 会返回 `true`,因为它们的值相同。 - **引用数据类型的比较**:若 `==` 用于引用数据类型(如对象、数组等),比较的是两个引用是否指向内存中的同一个对象,即它们的内存地址是否相同。例如,`Object obj1 = new Object(); Object obj2 = new Object();`,`obj1 == obj2` 会返回 `false`,因为 `obj1` `obj2` 指向不同的对象;而 `Object obj3 = obj1;` 时,`obj1 == obj3` 会返回 `true`,因为它们指向同一个对象 [^1]。 ### `equals` 方法 - **Object 类的 `equals` 方法**:`Object` 类是所有类的基类,其 `equals` 方法的默认实现使用的就是 `==` 运算符,即比较两个对象的引用是否相等。例如,定义一个自定义类 `A`,创建两个实例 `A objA1 = new A(); A objA2 = new A();`,`objA1.equals(objA2)` 会返回 `false`,因为它们是不同的对象。 - **重写后的 `equals` 方法**:大多数 Java 类(如 `String`、`Integer`、`ArrayList` 等)都重写了 `equals` 方法,目的是比较对象的内容是否相同。以 `String` 类为例,`String str1 = new String("hello"); String str2 = new String("hello");`,`str1.equals(str2)` 会返回 `true`,因为它们的内容相同。在 JDK 中,包装类、`String` `java.util.Date` 等类重写了 `equals` 方法,当两个对象的类型一致且内容相同(不能同时为 `null`)时,返回 `true` [^2][^3]。 ### 总结 - `==` 运算符在基本数据类型比较时比较值,在引用数据类型比较时比较内存地址。 - `equals` 方法在 `Object` 类中默认比较引用,但很多类会重写该方法来比较对象内容。 示例代码如下: ```java // 基本数据类型使用 == 比较 int num1 = 10; int num2 = 10; System.out.println(num1 == num2); // 输出 true // 引用数据类型使用 == 比较 String strObj1 = new String("test"); String strObj2 = new String("test"); System.out.println(strObj1 == strObj2); // 输出 false // 引用数据类型使用 equals 比较 System.out.println(strObj1.equals(strObj2)); // 输出 true ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值