java基础总结--equals与==

equals 与 ==

先上一段经典代码

public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int n=3;
        int m=3;
        
        System.out.println(n==m);
        
        String str = new String("hello");
        String str1 = new String("hello");
        String str2 = new String("hello");
        
        System.out.println(str1==str2);
        
        str1 = str;
        str2 = str;
        System.out.println(str1==str2);
    }

输出结果为true,false,true
==比较的是变量本身的值,而equal比较的是变量所指的内容
怎么理解这句话呢?
对于八种基本数据类型变量,本身的值就是内容,存储在栈中;而引用类型变量在栈中存储的是变量所指的地址,对象实例存储在堆中。str1和str2是指向两个字符串变量,所以值不同。
再来看看equals方法是如何比较所指向对象的内容。
equals方法是Object基类中定义的方法,它本身是用来比较对象的内存地址是否相同,一些子类重写它以后,就可以用来比较对象的内容,比如String类就重写了这个方法。

Object类中equals方法

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

String类中equals方法

public boolean equals(Object anObject) {  
        if (this == anObject) {  
            return true;  
        }  
        if (anObject instanceof String) { 
            //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;  
    }

其中value是String类定义的,用于存放字符串的字符数组
private final char value[];

再来看一个特殊情况

public static void main(String[] args){    
        String s1="hello";
        String s2="hello";
        String s3 = new String("hello");
        System.out.println(s1==s3);
        System.out.println(s1==s2);
    } 

输出false,true
输出true是因为java的字符串缓冲区,类似于常量池的东西,这样创建的String不是一个新的对象,因为java发现已经有一个"hello",就会将s2直接指向它,而不会创建一个新的对象。

猜你喜欢

转载自www.cnblogs.com/authetic/p/8908224.html