登录
原创

Java中的==和equals

发布于 2020-11-04 阅读 294
  • Java
原创

简介

"=="操作符的作用

  • 用于基本数据类型的比较
  • 判断引用是否指向内存中的同一块地址

equals 的作用:

  • 默认情况下:判断两个变量是否是对同一个对象的引用,即指向的堆内存中的地址是否相同
  • 也可重写,实现自己的比较逻辑

理论知识介绍

(一)Java中的基本数据类型和引用数据类型

  • 基本数据类型: byte,short,char,int,long,float,double,boolean
  • 引用数据类型: 接口、类、数组等

(二)Java的栈内存、堆内存和常量池

  • 栈中存放的是基本数据类型的值和对象的引用
  • 堆中存放的是new出来的对象和数组
  • 常量池中存放字符串常量和final类型的变量

(三)Object类中的equals方法

public boolean equals(Object obj) {
    return (this == obj);
} 

Object类是所有类的直接或间接父类,所有类中的equals()方法都继承自Object类。Object类中equals方法是用==判断对象引用是否指向同一内存地址。

(四)String类对equals方法进行了重写,如下:

public boolean equals(Object anObject) {
    if (this == anObject) { 
        return true;
    }   
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

String类中equals方法首先判断对象的内存地址是否相等,相等则返回true。如果不满足,之后会判断括号内的对象是否是String类型,是的话则会判断两个字符串对象的的长度是否相等,最后转成char[]数组,判断每个位置的字符是否相等,如果相等则返回true。其实就是比较内容是否相等。

实例分析

例子一:

int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); //true

num1 和num2都是int类型,值都为10,因此使用”==”相等。

例子二:

String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); // true

首先在常量池中创建字符串“abc”,之后会在栈中创建引用s1和s2,并且都指向常量池中的“abc”,所以内存地址一样,值也一样。

例子三:

String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3 == s4); //  false
System.out.println(s3.equals(s4)); // true

s3和s4指向的是new出来的对象,开辟的是不同的堆内存,所以内存地址不同,但是值相同。

例子四:

String s1 = "abc";
String s3 = new String("abc");
String s5 = s3;
System.out.println(s1 == s3); // false
System.out.println(s1.equals(s3)); // true
System.out.println(s5==s3); // true

s3和s5是同一个对象的不同引用,指向的是相同的内存地址。

例子五:

class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        Student other = (Student) obj;
        return this.age == other.age;
    }
}

public class Test {

    public static void main(String[] args) {

        // s1和s2是两个不同的对象
        Student s1 = new Student("Tom", 23);
        Student s2 = new Student("Tom", 23);

        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}

输出

false // 不同对象,引用地址不同
true // 重写了equals方法,比较的是年龄是否相同

评论区

励志做一条安静的咸鱼,从此走上人生巅峰。

0

0

0

举报