Java中==与equals方法的区别

来源:互联网 发布:阿里云手机云空间 编辑:程序博客网 时间:2024/06/05 21:12

Java中进行变量的比较时,根据变量的类型的不同选择使用==或是eauals方法进行比较。

1.==比较的是对象的物理地址,若两个变量的物理地址相同,那么这两个变量的值肯定是相同的。Java中的基本数据类型(8种:byte,short,char,int,long,float,double,boolean)在比较时应使用==运算符。

2.equals方法出自Object类,Object类是所有类的顶级父类,也就是说所有的类都直接或间接的继承了Object类中的equals方法,在Object类中equals方法比较的是两个变量的物理地址,下面是Object类中equals方法的实现代码:

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

发现,其是使用==实现的。

有些类在继承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方法中先使用了==进行比较,若两个变量的物理地址一样,则两个变量的值肯定相等 ;接下来比较了两个变量的长度,若长度不一致,那么这两个变量的值肯定不相等,直接返回false;若长度相等,代码中又进行了逐位进行比较的操作。

对于除基本数据类型之外的类,==进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false 

在创建Java实体类时若没有覆写equals方法,比较时将使用Object类的equals方法,比较结果和==一致。所以,一般会覆写equals方法,采用类似与String类中equals方法的实现。

但是对于String类有个特殊的概念——字符串缓冲池
总结:

1.==比较的是两个对象的内存地址;

2.equals比较的是两个对象的字面值;

3.字符串缓冲池在内存中,String类变量比较特殊;

4.在创建实体类时,需要覆写equals方法,不然使用的仍是Object类中的equals方法(底层使用==实现)。


0 0
原创粉丝点击