Java中equals和==

本文详细解析了Java中==运算符与equals方法的区别及应用场景。通过实例对比基本类型、包装类及自定义对象间的比较方式,揭示了两者在对象引用与内容比较方面的差异。

        ==是关系运算符,生成的是一个布尔型的结果。

        Java编程思想中指出——它们评价的是运算对象值之间的关系。比较的对象可以是任何数据类型。

        equals是一个方法,只有对象实例来调用,返回的也是布尔型结果。

1、==的比较

        我们用三个例子说明==的作用结果。

1.1、基本类型比较

        基本类型储存的就是值,所以当==作用在两个基本类型时候,比较的就是两个值是不是一样。

        注意,数值型是区分有符号和无符号的。

        也就是:

double a2 = 3.14d;
double b2 = -3.14d;
System.out.println(a2==b2);

        输出结果是false。

1.2、基本类型包装类比较

        基本类型包装类的比较和基本对象类型就不一样了,因为包装类已经是类这个级别了,不再是基本数据类型了。

        当==作用在两个对象上的时候,比较的不单单是对象的内容是否相等,他也会判断对象的引用是否相同。

        在说明包装类==比较时候,我们以String为例,先说明一下String类型创建对象时候的特点。

        在JVM中存在一个String池——这个池中保存了很多String对象,可以被共享使用,从而提高效率。

        当我们声明一个String对象时候(String a = "123"),如果String池中已经存在"123"这种String对象,那么直接将这个String对象的引用赋值给a;

        当我们创建一个String对象时候(String a = new String("123")),不管String池中有没有"123"这个String对象,他都会先创建"123"这样一个字符串对象,然后将引用赋值给a。

        我们用一些例子来看看==作用在String对象时候的结果:

String a = "123";
String b = "123";
String c = "234";
String d = new String("123");
String e = new String("123");


        不管c和哪个对象比较,结果肯定都是false,所以关于c的比较我们就略过,重点看以下几个比较:

System.out.println(a==b);
System.out.println(a==d);
System.out.println(b==d);
System.out.println(d==e);

        对于a,b都是字符串的声明都是从String池中获取到的"123"的引用,所以a==b结果显然是true。

        对于d,e都是字符串对象的创建,不管String池中有没有"123"这种字符串的引用,都会使用new关键字创建两个对象,哪怕两者内容相同,因为是两个对象,所以d==e结果显然是false。

        对于声明的对象a,b和创建的对象d,e比较,因为不是同一个对象的引用,即使内容相同,结果都是false。

        实际输出:

true
false
false
false

1.3、实例对象比较

        实例对和包装类的比较象的比较类似,比较的方面除了内容也还有引用。

        当然实例对象没有String池这个东西,所以如果是创建的两个对象作比较,返回的会是false;如果声明了两个对象的引用,并且指向同一个对象,那么比较的结果就会是true:

        假设我们有个类,类名是Person:

Person p1 = new Person();
Person p2 = new Person();
Person p3 = p1;
Person p4 = p1;
p1==p2;//false
p3==p4;//true
p1==p3;//true

2、equals的比较

        同样的,我们从三个方面说明equals的作用结果:

2.1、基础数据类型:

        equals是一个方法,只能是对象实例来调用,基本类型显然是不能调用equals方法。

2.2、基本类型包装类

        以String为例:我们先看根类Object类中equals方法的说明:

        String对equals方法进行了重写:


        所以当使用equals比较两个字符串对象的时候,比较的都是两个对象内容是否一致:

String a = "123";
String e = new String("123");
a==e;//false
a.equals(e);//true


2.3、实例对象

        实例对象调用equals方法和使用==的效果是一样的,如果你并没有重写equals方法的打算。

        从实现来看,对象调用equals方法返回的结果就是==作用在两个对象上的结果。

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 ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值