美文网首页
Java中 "equals"和"=

Java中 "equals"和"=

作者: 积木Blocks | 来源:发表于2019-02-14 17:05 被阅读19次

1.前言

在Java中,需要比较对象是否相等。则需要用到“equals”和“==”。一般来说比较基础数据类型值相等用“==”,比较引用数据类型值相等用“equals”。


2.基础数据类型

数据的值直接存储在内存的栈空间,没有“引用”的概念。

基础数据类型 所占字节数 值类型
byte 1 数值型整数
boolean 1 布尔型
char 1 字符型
short 2 数值型整数
int 4 数值型整数
long 8 数值型整数
float 4 数值浮点类型
double 8 数值浮点类型

3.引用数据类型

都是Object的子类,引用对象的首地址存储在内存中的栈空间,而对象的值存储在内存的堆空间。


4."=="

  • 基础数据类型,比较的是基础数据类型的值。
  • 引用数据类型,比较的是引用数据的引用地址。所以引用数据类型通常不使用“==”比较。

示例

public class MyTest {

    public static void main(String[] args) {
        int a = 0;
        int b = 0;
        MyTest test1 = new MyTest();
        MyTest test2 = new MyTest();
        System.out.println(a == b);
        System.out.println(test1 == test2);
    }
}

运行结果


上面的结果已经很明显了,a和b比较,由于都是基本数据类型,所以比较的是值,返回为true。而test1和test2,比较的是引用地址,这里是new了2个对象,在堆上开辟了2个不同的空间,所以地址不同,返回为false。
5.equals

其实在equals的默认比较中也是比较的引用地址。除非去重写equals方法。默认都是继承Object类中的equals。

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

基础数据类型的包装类和String类都重写了equals方法,可以直接进行值比较。其他对象在不修改的情况下还是比较引用地址。

String类修改equals方法,比较每个字符是否相等。

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

6.相关面试题

1.下面程序的运行结果?

public class MyTest {

    public static void main(String[] args) {
        String a = "123";
        String b = "123";
        String c = new String("123");
        System.out.println(a == b);
        System.out.println(a.equals(b));
        System.out.println(a == c);
        System.out.println(a.equals(c));
    }
}

运行结果

  • a=b 返回true 和 a.equals(b) 返回true
    字符串缓冲池:程序在运行的时候会创建一个字符串缓冲池,当使用 a = “123”这样的表达式创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象。a先被放到了池中,所以在b被创建的时候,程序找到了具有相同值的 a,将b引用a所引用的对象”123”.
    故a,b指向同一个内存区域,所以==和equals比较结果都是true.
  • a==c 返回false
    这里的c,new了一个新的对象,所以地址肯定和a不同
  • 题外话
    • "c创建对象"的方式会影响程序的性能
    • "a==c"这种比较方式也会建议用equals()取代
    • 这些在Android Studio都会被lint检测,进行提示,不建议使用。

相关文献

相关文章

网友评论

      本文标题:Java中 "equals"和"=

      本文链接:https://www.haomeiwen.com/subject/lbpeeqtx.html