在项目中,我们经常要比较两个对象和值是否相等,所以经常会用到==与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的情况。