Java程序中测试两个变量时否相等有两种方法: == 和 equals。

==判断

当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数字类型(不一定要求数据类型严格相同),则只要两个变量的值相同,就将返回true。
但对于两个引用类型变量,只有它们指向同一个对象时,== 判断才会返回true。
== 不可用于比较类型上没有父子关系的两个变量。

public static void main(String[] args) {
int i = 65;
float f = 65.0f;
// 输出true
System.out.println("65和65.0f是否相等?" + (i == f)); char c = 'A';
// 输出true
System.out.println("65和'A'是否相等?" + (i == c)); String s1 = new String("Test");
String s2 = new String("Test");
// 输出false
System.out.println("s1和s2是否相等?" + (s1 == s2));
// 输出true
System.out.println("s1和s2是否相等?" + (s1.equals(s2))); // 编译不过
// System.out.println("Test" == new EqualTest());
}

需要注意 "Test"和new String("Test")是有区别的?

  “Test”是字符串直接量(即可以在编译时就计算出来的字符串值),JVM使用常量池来管理这些字符串,

  当使用new String("Test")时,JVM先使用常量池来管理“Test”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。也就是说new String("Test")一共创建了两个字符串对象。

常量池(constant pool)专门用来管理在编译时被确定并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口中的常量,还包括字符串常量。

public static void main(String[] args) {
String s1 = "Hello";
String s2 = "H";
String s3 = "ello";
// 不能在编译时确定
String s4 = s2 + s3;
// 在编译时就确定下来了,直接引用常量池中的“Hello”
String s5 = "H" + "ello";
// 引用内存中新创建的String对象
String s6 = new String("Hello"); // true
System.out.println(s1 == s5); // false
System.out.println(s1 == s4); // false
System.out.println(s1 == s6);
}

equals判断

equals()方法是Object类提供的一个实例方法,因此所有的引用变量都可以调用该方法来判断是否与其他引用变量相等。

判断两个对象相等时,和==运算符没有区别,同样要求两个引用变量指向同一个对象才返回true。因此Object提供的equals方法没有太大的意义,可以重写equals()方法实现。

注意,String已经重写了equals()方法,只要两个字符串所包含的字符串序列相同,则返回true。

笼统的说equals()方法是判断两个对象的值相等,这样的说法并不准确。

public class EqualsTest {
public static void main(String[] args) {
Person p1 = new Person("小王", "1234");
Person p2 = new Person("王二", "1234");
Person p3 = new Person("小王", "12345"); // true
System.out.println(p1.equals(p2));
// false
System.out.println(p1.equals(p3));
}
} class Person {
private String name;
private String idStr; public Person() { } public Person(String name, String idStr) {
this.name = name;
this.idStr = idStr;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getIdStr() {
return idStr;
} public void setIdStr(String idStr) {
this.idStr = idStr;
} // 重写equals方法,自定义两个对象相等的条件
public boolean equals(Object obj) {
// 如果两个对象是同一个对象
if (this == obj) {
return true;
} // 只有当obj对象是Person对象
if (obj != null && obj.getClass() == Person.class) {
Person personObj = (Person) obj;
// 并且当前对象的idStr和obj对象的idStr相等时,才判断两个对象相等
if (this.getIdStr().equals(personObj.getIdStr())) {
return true;
}
} return false;
}
}

正确的重写equals()方法,应该满足下列条件:

1. 自反性:对任意的x,x.equals(x)一定返回true。

2. 对称性:对任意x, y,如果x.equals(y)返回true,则y.equals(x)返回true。

3. 传递性:对任意x, y, z,如果x.equals(y)返回true,y.equals(x)返回true,则x.equals(z)也返回true。

4. 一致性:对任意x, y,如果对象中用于等价比较的信息没有改变,那么无论x.equals(y)多少次,返回的结果应该保持一致,要么一直是true,一直是false。

5. 对任何不是null的x, x.equals(null)一定返回false。

Object默认提供的equals()只是比较对象的地址,即Object类的equals()方法比较的结果与==运算符比较的结果完全相同。因此,在实际应用中常常需要重写equals()方法,相等的条件是由业务要求决定,因此equals()方法的实现也是由业务要求决定。

==和equals方法的更多相关文章

  1. List<T>Find方法,FindAll方法,Contains方法,Equals方法

    假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...

  2. [java] 更好的书写equals方法-汇率换算器的实现(4)

    [java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]>   [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...

  3. java中的equals()方法重写

    如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...

  4. java提高篇(十三)-----equals()方法总结

    equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...

  5. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  6. equals()方法

    equals()方法是根类Object中的一个方法,子类可以根据需要重写该方法(比如:String类). 一.Object类中的equals()方法实现如下: public boolean equal ...

  7. C#中==与Equals方法的区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  8. java重写equals方法

    @Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...

  9. 重写Object类中的equals方法

    Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...

  10. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

随机推荐

  1. hihocoder #1152 Lucky Substrings 【字符串处理问题】strsub()函数+set集合去重

    #1152 : Lucky Substrings时间限制:10000ms单点时限:1000ms内存限制:256MB描述A string s is LUCKY if and only if the nu ...

  2. POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串

    题目链接:https://vjudge.net/problem/POJ-3693 Maximum repetition substring Time Limit: 1000MS   Memory Li ...

  3. canvas刮刮卡

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  4. workerman介绍

    WorkerMan的特性 1.纯PHP开发 使用WorkerMan开发的应用程序不依赖php-fpm.apache.nginx这些容器就可以独立运行. 这使得PHP开发者开发.部署.调试应用程序非常方 ...

  5. leetcode 102 Binary Tree Level Order Traversal(DFS||BFS)

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. pod lib lint 报错 Unable to find a specification for `AMap2DMap` depended upon by `DingtalkPod

    执行 pod验证 报错如下 ➜  DingtalkPod git:(2.0.0) ✗ pod lib lint --sources='https://github.com/AloneMonkey/Mo ...

  7. bzoj 4753 [Jsoi2016]最佳团体——0/1分数规划

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 0/1分数规划裸题. #include<iostream> #includ ...

  8. java计算两个时间相差(天、小时、分钟、秒)

    public static Long dateDiff(String startTime, String endTime, String format, String str) { // 按照传入的格 ...

  9. openStack高可用性和灾备方案

    1. 基础知识 1.1 高可用 (High Availability,简称 HA) 高可用性是指提供在本地系统单个组件故障情况下,能继续访问应用的能力,无论这个故障是业务流程.物理设施.IT软/硬件的 ...

  10. SQL 排序规则问题

    http://blog.csdn.net/delphigbg/article/details/12744807 MSSQL排序规则总结   什么是排序规则呢? 排序规则根据特定语言和区域设置标准指定对 ...