日期:2014-05-20  浏览次数:20626 次

Java中“==”和equals的比较
在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型,其余的都是引用类型。
“==”是比较两个变量的值是否相等,“equals”是比较两个对象变量所代表的对象的内容是否相等。
例如下面的代码
public static void main(Strint[] args)
{
 String str1=new String("abc");
  String str2=new String("abc");
  if(str1==str2)
  {
  System.out.println("str1==str2");
  }
  else
  {
  System.out.println("str1!=str2");
  }
}
  可能我们都会以为输出的应该是str1==str2,但是结果却是str1!=str2。这个并不是我们想要的,那么为什么会出现这样的情况的呢,我们仔细想想,在java中不存在指针,存在的只是引用,当我们使用String str1 的时候他并没有创建什么对象,只是在栈内存上开辟了一个空间,用于存放str1我存储的东西,当然我们没有使用new String之前,在str1的空间里的值是NULL。只有当我们调用了new String之后才会真正的在堆内存上去创建str1这个对象的实体。这时候在栈内存中的str1存储的是str1在堆中实体对象的首地址。同样str2也是执行同样的操做。可能还是不懂,下面看一张图片,大家就应该明白了。


  当我们执行上面的代码的时候,str1和str2存储的分别是str1和str2的实体对象的首地址,并不是对象本身,所以输出的结果才是str1!=str2。
  下面我们来修改一下上面的代码
public static void main(String[] args)
{
  String str1=new String("abc");
  String str2=new String("abc");
  String str3=str1;
  if(str1==str2)
  {
  System.out.println("str1==str2");
  }
  else
  {
  System.out.println("str1!=str2");
  }
  if(str1==str3)
  {
  System.out.println("str1==str3");
  }
  else
  {
  System.out.println("str1!=str3");
  }
}
上面的代码我们创建了一个String对象str3,并将str1负值给str3,这样按照上面的那张图片,str3存储的应该是和str1一样的地址,所以我想大家就知道输出的结果了,str1==str3。
  可是我们很多时候想做的并不是这个比较,我们想做的是比较两个对象的值是否相等,我们可以使用Object类中的equals()方法。由于在java中规定所有的类都是Object所以也就会继承这个方法,但是在String类中,String类重写了这个方法,在java帮助文档中给出了如下的描述:
equals
public boolean equals(Object anObject)
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为true。
覆盖:
类 Object 中的 equals
参数:
anObject - 与此 String 进行比较的对象。
返回:
如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回false。
我们可以调用String的类的equals()方法传递一个我们想要比较的对象,我们按照这个将程序改成如下:
public static void main(String[] args)
{
 String str1=new String("abc");
  String str2=new String("abc");
if(str1.equals(str2))
  {
  System.out.println("str1 equals str2");
  }
  else
  {
  System.out.println("str1 not equals str2");
  }
}
程序的输出结果是str1 equals str2。最后在总结一下:当我们声明一个引用类型变量时,系统只为该变量分配了引用空间,并未创建
一个具体的对象;当用new为对象分配空间后,将对象的引用赋值给引用变量。当我比较两个对象的引用的时候,比较只是对象的首地址,只有调用equals()方法的时候我们才能用于比较两个对象的值。

------解决方案--------------------
总之记住一点,对于基本数据类型的比较就用==,而对于封装过的类型就用equals方法就行了。
------解决方案--------------------
老问题了 一个是值比较 一个是地址的比较
------解决方案--------------------
5235235235
------解决方案--------------------
都被你们说完了,接分走人
------解决方案--------------------
LZ..为什么用首地址这样的说法,直接说内存不就OK了,以为指针啊..

听到通常的说法是==是对内存的比较,所以,new了两个就是两个不同的内存地址
而equals是object的方法,string里面重写了,是针对string类的,假设你写了一个person类当model,你也要对equals重写,不然,两个资料完全一样的person,但new了两个,它们也是不等的..
可以说,equal是数据上的相等就相等,==是内存一样才相等.

一般不要用string类来做这个例子好点.因为string类被处理过了.下面这段会显示==,
String ab = "lkj";
String abc = "lkj";
if(ab==abc){
System.out.println("==");
}else{
System.out.println("!=");
}
------解决方案--------------------
很好。对于我们刚入门者来说还是有帮助