首先对http://blog.csdn.net/qq_32907417/article/details/50672904 的观点进行一下转载和总结。
下面是==和equal在不同情况下的区别:
1.基本数据类型
== 比较两者数值
2.类
== 比较两者在内存中的地址是否相同
equal 具体问题具体分析,不同类可能equal的实现不同。
例如,在Object中 equal()仍然是比较两者内存地址,在String中该方法被覆盖为比较两个字符串内容是否一致。
3.字符串缓冲池
下面引用一下转载的话:
原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将s2引用s1所引用的对象"Monday" 。
这也就导致了两个分别new操作的字符串却指向了同一内存地址。这其实也是java的一种优化手段,也许有人会有这样的疑问,既然2者指向同一内存,那我修改一个,另一个岂不是也被动修改了。但实际String的定义就是不被修改的字符串,要保持内存地址不变化并且还要修改掉里面的内容,通过String进行简单操作恐怕做不到。所以介绍另一个对象StringBuffer,StringBuffer中的内容可以修改掉,并且新申请的两个StringBuffer对象,java也不可能把他们的内存地址优化到一起。下面用代码进行举例:
public class Y2017Aug29b {
public static void main(String args[])
{
String s1 = "abc";
String s2 = "abc";
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println("stringbuffer间比较");
if(sb1 == sb2)
{
System.out.println("相等");
}
else
{
System.out.println("不等");
}
System.out.println("string间比较");
if(s1 == s2)
{
System.out.println("相等");
}
else
{
System.out.println("不等");
}
}
}
执行结果
stringbuffer间比较
不等
string间比较
相等
4.关于对象之间==比较,我还做了一点小实验
Integer h = new Integer(2);
Object z = h;
这里通过比较,最终z==h ,这也更说明了等号是对内存地址的比较而与两者是否是同一类型无关。
具体代码如下:
public class Y2017Aug29a {
public static void main(String args[])
{
Object a = new Integer(1);
Object b = new Object();
Object c = new Integer(1);
Object d = new String("1");
Integer e = (Integer)a;
Integer h = new Integer(2);
Object z = h;
System.out.print("a and b");
different(a, b);
System.out.print("a and c");
different(a, c);
System.out.print("a and d");
different(a, d);
System.out.print("a and e");
different(a, e);
System.out.print("h and z");
different(h, z);
}
public static void different(Object x,Object y)
{
if(x==y)
{
System.out.println("相等==");
}
else
{
System.out.println("不等!=");
}
}
}
执行结果
a and b不等!=
a and c不等!=
a and d不等!=
a and e相等==
h and z相等==
如果有说的不对的地方,望指正,谢谢!!