Java中equals和==的区别

来源:互联网 发布:长白山东方神韵淘宝 编辑:程序博客网 时间:2024/06/14 08:21

简介:

equals 方法是定义在 Object 类中的一个方法
具体可以看我的另一篇文章: Java中的equals方法

equals和==的区别:

1、字符串

对于字符串来说:

  1. “==” 比较的是两个字符串在内存中的首地址
  2. “equals” 比较的时候两个字符串的内容

/* Test1 */String s1 = "abc";String s2 = "abc";System.out.println("s1 == s2 : " + (s1 == s2));System.out.println("s1.equals(s2) : " + s1.equals(s2));Output:s1 == s2 : trues1.equals(s2) : true

s1 和 s2 的内容相同,都是”abc”,所以 equals 的结果为 true

s1 和 s2 是两个对象,为什么 “==” 的结果也为 true 呢?
答:在程序创建的时候,会创建一个字符串缓冲区,以 String s1 = "abc" 形式创建的字符串,程序会再缓冲区中寻找或创建值为 “abc” 的首地址并引用,当创建 s2 的时候,程序发现缓冲区中已经有相同的内容,所以 s2 直接引用这块地址,所以 s1 和 s2 引用了同一块地址,所以”==”为 true。


/* Test2 */String s1 = "abc";String s2 = new String("abc");System.out.println("s1 == s2 : " + (s1 == s2));System.out.println("s1.equals(s2) : " + s1.equals(s2));Output:s1 == s2 : falses1.equals(s2) : true

在 Test2 中 “s1 == s2” 就不再为 true 了,这是因为 s2 的声明方式为 String s2 = new String("abc"); 它的意思是请求在缓冲区中重新开辟一段内存在存放字符串 “abc” 所以它的 s1 的 “abc” 虽然内容相同,但是它们的首地址不相同。


/* Test3 */String s1 = new String("abc");String s2 = new String("abc");System.out.println("s1 == s2 : " + (s1 == s2));System.out.println("s1.equals(s2) : " + s1.equals(s2));Output:s1 == s2 : falses1.equals(s2) : true

Test3 中 s1 和 s2 都是通过 new 出来的字符串,结果与 Test2 一样,同理。


2、非字符串

对于非字符串对象来说

  1. equals 和 == 的作用相同,都是用来比较对象实例在内存中的首地址

那么有人就要问了,字符串也是对象,为什么和非字符串对象不同的?
答:在一般情况下,equals 方法定义在 Object 类中,所以一般类使用的是 “祖宗” 类 Object 类中的 equals方法,查阅源码如下:

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

我们知道想要 equals 达到自己想要的效果,必须复写 equals 方法,所以为什么 String 类的 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;    }

阅读 equals 方法后,很容易发现,复写的 equals 方法比较的是两个字符串的内容


3、基本类型

对于 Java 中的基本类型:

byte, short, char, int, long, float, double, boolean

1. 用 “==” 比较的是两者的值是否相同,如(其他类似):

int a = 1;int b = 1;System.out.println("a == b : " + (a == b));Output:a == b : true

需要注意的是:基本类型是没有 equals 方法的,如:a.equals(b) 是没有这种语法的。


4、包裹类型

对于Java中的包裹类型:

Boolean, Character, Byte, Shot, Integer, Long, Float, Double

1. “==” 是来比较两者的首地址是否相同
2. “equals” 是比较两者的内容是否相同

Integer a = new Integer(1);Integer b = new Integer(1);System.out.println("a == b : " + (a == b));System.out.println("a.equals(b) : " + a.equals(b));Output:a == b : falsea.equals(b) : true

总结:

本文只是列出了一些常用数据类型的浅显的区别,在类中是否复写了 equals 方法,则需要自己去查阅源码,其他的具体实现方法,需要查看jdk文档或者查阅源码。



个人浅见,欢迎指正!

原创粉丝点击