"=="与"equals"区别(转)

要彻底搞清楚二者区别需要首先搞清java的数据类型有哪些。

1、java数据类型可以分为:

基本类型和引用类型。基本类型包括数值类型(整型、浮点型)、布尔类型、字符类型​;引用类型包括类、接口、数组,当然string属于引用类型。

基本数据类型存的是数据本身,好比是打开抽屉取出其中的具体的书本;引用类型存的是数据空间地址,好比打开抽屉里边放着打开书本所在的具体的抽屉的钥匙。

2、搞清数据类型之后,介绍二者区别:​

== :一个运算符。

equals:string对象的方法

对于基本数据类型,==比较的就是具体的值,相等返回true,不等返回false,没有equals方法。

对于引用数据类型,​==比较的是对象的地址,equals比较的是对象的地址所存储的具体的值即比较的是对象的具体内容。

举例:

int a = 1;

int b =1 ;

System.out.println(a==b);​//返回true,需要说明的是基本类型无equals方法

​String a1=new String( "foo ");

String b1=new String( "foo ");

System.out.println(a1==b1);//返回false,因为a1,b1为两个对象,他们地址不同

System.out.println(a1.equals(b1));//返回true,两个对象地址不同但各自地址存的具体内容是相同的,都是foo

​String str1 = "hello";

String str2 = "hello";

System.out.println(str1==str2);//返回true

System.out.println(str1.equals(str2));//返回true,str1和str2都指向同一个对象“hello”,因此地址和内容都是相等的

3、​在Object类源码中equals是这样的:

public boolean equals(Object obj) { 

        return (this == obj);

}

他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如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;

    }

Object对象默认使用了==操作符。当自定义类没有覆盖equals方法时,equals和==等价。因此要实现比较两个对象内容是否相等时,类的创建者需要重写equals方法。

本人转载自:http://blog.sina.com.cn/s/blog_a7a17bc30102wl70.html

你可能感兴趣的:("=="与"equals"区别(转))