Java中==与equals的区别

来源:互联网 发布:堆优化的dijkstra 编辑:程序博客网 时间:2024/05/29 00:34

表面看都是判断两个“值”是否相等,其实不然

1、==:用来判断两个变量的是否相等,即两个对象在内存中存储的值是否相等,内存中的值相等,那么内存的首地址就要相等,要比较两个基本类型的数据或两个引用变量是否  相等,只能用==操作符;

2、equals:用来判断两个独立对象的内容是否相等,即不管你在内存里是怎么存的,只要内容相同就相等,字符串的比较基本上都是使用equals方法。

 

1)、Object的equals源码分析:

从下面代码可以看出,Java基类中equals就等于==

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

 

2)、Integer的equals源码分析:

从下面代码中可以看出,对于基本数据类型,如果一个对象是该基本数据类型,并且他们在内存中的值相等,则他们equals。

 

public boolean equals(Object obj) {        if (obj instanceof Integer) {            return value == ((Integer)obj).intValue();        }        return false;}

 

3)、String的equals源码分析:

从下面的代码中可以看出,对于一个独立对象,可以自己实现自己的equals方法,在Sting里,如果两个String在内存中的值不相等,但是只要他的字符的序列相等,那么他们相equals。

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

 

4)、自定义的equals方法:

下面的内容,只要输入的内容有一个字符与zhangsan中的字符相同就相equals。

public class EqualsTest {String name = "zhangsan";public static void main(String[] args) {EqualsTest et = new EqualsTest();System.out.println(et.equals("白z白"));}@Overridepublic boolean equals(Object obj) {if (this.name == obj) {return true;}if (obj instanceof String) {String objStr = (String) obj;for (int i = 0; i < this.name.length(); i++) {for (int j = 0; j < objStr.length(); j++) {if(this.name.charAt(i)==objStr.charAt(j)){return true;}}}}return false;}}

 

3、例子分析:

public class EqualsTest {public static void main(String[] args) {System.out.println("1="+(aStr==bStr));System.out.println("2="+(aStr.equals(bStr)));String cStr ="foo";String dStr ="foo";System.out.println("3="+(aStr==cStr));System.out.println("4="+(cStr==dStr));System.out.println("5="+(cStr.equals(dStr)));}}

 

输出结果分析:

1=false:因为在内存中存在两个foo,所以肯定首地址不同;
2=true:因为他们内容是相同的;
3=false:因为aStr是new出来的,那么每次他所在内存和其他任何一个不同;
4=true:其实是指向同一内存地址,也就是只有cStr开辟内存空间,dStr其实是直接指向cStr;
5=true:内容当然相等。

总结:

要比较两个基本类型(如byte、short 、int 、long 、float、double、char、boolean)的数据或两个引用变量是否相等,只能用==操作符;

字符串的比较基本上都是使用equals方法,因为两个字符串只要字符序列相等,也是equals的。