`

Java中的equals与==使用与区别

阅读更多

在项目中,我们经常要比较两个对象和值是否相等,所以经常会用到==与equals的比较,因此弄清楚两者区别,非常必要,下面总结一下两种用法与区别:

        简单的来说,==与equals区别主要是在对象比较使用上,==比较的对象既要值相同,同时内存地址也有要相同,equals只要值相等就可以了;但是在进行String类型对象比较是要特别注意,必须要理解比较的两个String对象是否是两个不同对象还是相同的对象;例如:

  例子1:

public class TestString { 
    public static void main(String[] args) { 
        String s1 = "test1"; 
        String s2 = "test1"; 
        if (s1 == s2) 
            System.out.println("s1 == s2"); 
        else 
            System.out.println("s1 != s2"); 
    } 
} 

 

输出的结果是:s1 == s2

 

 例子2:

public class TestString { 
    public static void main(String[] args) { 
        String s1 = "test1"; 
        String s2 = new String("test1"); 
        if (s1 == s2) 
            System.out.println("s1 == s2"); 
        else 
            System.out.println("s1 != s2"); 
        if (s1.equals(s2)) 
            System.out.println("s1 equals s2"); 
        else 
            System.out.println("s1 not equals s2"); 
    } 
} 

 

输出结果是:

       s1 != s2
       s1 equals s2

分析:在例子1中因为s1与S2都指向一个引用,所以它们在内存中占用一个内存地址,==比较就是所谓的对象既要值相同,同时内存地址也有要相同;例子2中,由于s2使用了new,在内存中开辟了一个新的内存空来存储s2对象,所以,在例子2中出现了两个String类型的test1对象,所以出现了例子2的结果;

总结:

    在对String类型对象比较是要特别注意,顺便提下Java中String的生成机制,Java中程序在运行的时候会创建一个字符串缓冲池 在例子1中当使用 s2 = "test1" 这样的表达式创建字符串的时候,程序首先会 在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被 放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将 s2 引用 s1 所引用的对象"Monday"

第二段程序中,使用了 new 操作符,他明白的告诉程序: “我要一个新的!不要旧的!”与是一个新的"test1"String对象被创 建在内存中。他们的值相同,但是位置不同,所以出现了例子2的情况。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics