在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()方法的时候我们才能用于比较两个对象的值。

解决方案 »

  1.   

    总之记住一点,对于基本数据类型的比较就用==,而对于封装过的类型就用equals方法就行了。
      

  2.   

    很简练,说的也对,但是也有特殊情况。比如下面的程序
    String str1 = "abc"; 
    String str2 = "abc"; 
    System.out.println(str1==str2); //true
    str1和str2是相等的 这个里面有堆和栈的问题 我是新学java的谢谢你的总结
      

  3.   

    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("!=");
      }
      

  4.   

    简单的说:equals比较的是内容,而==比较的是地址...
      

  5.   

    new String()构造方法肯定是产生了一个新的字符串对象,和普通的其他类构造方法一样
      

  6.   

    引用---作者:风中叶(张龙)
    1.equals()方法,该方法定义在Object 类当中,因此Java  中的每个类都具有该方法, 
       对于Object 类的equals()方法来说,它是判断调用equals()方法的引用与传进来的引 
       用是否一致,即这两个引用是否指向的是同一个对象。对于Object 类的equals()方 
       法来说,它等价于==。 
    2. 对于String  类的equals()方法来说,它是判断当前字符串与传进来的字符串的内容 
       是否一致。 
    3. 对于String 对象的相等性判断来说,请使用equals()方法,而不要使用==。 
    4. String 是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新 
        的String 对象,而不是向原有的String 对象追加内容。 
    5. String Pool (字符串池) 
    6. String s = “aaa”; (采用字面值方式赋值) 
    1) 查找String Pool 中是否存在“aaa”这个对象,如果不存在,则在String Pool  中创建 
       一个“aaa”对象,然后将String            Pool  中的这个“aaa”对象的地址返回来,赋给引 
       用变量s,这样s 会指向String Pool 中的这个“aaa”字符串对象 
    2) 如果存在,则不创建任何对象,直接将String Pool 中的这个“aaa”对象地址返回来, 
       赋给s 引用。 
    7. String s = new String(“aaa”); 
    1) 首先在String Pool  中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool 
        中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对 
       象,然后将堆中的这个“aaa”对象的地址返回来,赋给s 引用,导致s 指向了堆中 
       创建的这个“aaa”字符串对象。 
    2) 如果没有,则首先在String Pool 中创建一个“aaa  “对象,然后再在堆中(heap)创 
       建一个”aaa  “对象,然后将堆中的这个”aaa  “对象的地址返回来,赋给s 引用, 
       导致s 指向了堆中所创建的这个”aaa  “对象。 
      

  7.   

    http://blog.csdn.net/iterzebra/article/details/6757681
      

  8.   

    http://blog.csdn.net/iterzebra/article/details/6757681