class lesson 
{
  public static void main(String args[])
  {
    String str1 = "abcd";
    String str2 = "abcd";
    String str3 = str1;
    if (str1==str2)
System.out.println("ture");
    if (str1==str3)
System.out.println("right");
   }
}
-------------------------------------------------
打印出rure right 
--------------------------------------------------
------------------------------------------------------
class lesson 
{
  public static void main(String args[])
  {
    String str1 =new String("abcd");
    String str2 =new String("abcd");
    String str3 = str1;
    if (str1==str2)
System.out.println("ture");
    if (str1==str3)
System.out.println("right");
   }
}
-------------------------------------
只打印right
为什么???
字符串池为什么不起作用了?

解决方案 »

  1.   

    看看,,呵,就是equals 和==的驱别了,,
      

  2.   

    因为==表示两个对象完全一样,而使用Equals表示两者值一样
      

  3.   

    class lesson 
    {
      public static void main(String args[])
      {
        String str1 =new String("abcd");
        String str2 =new String("abcd");
        String str3 = str1;
        if (str1.equals(str2))
    System.out.println("ture");
        if (str1==str3)
    System.out.println("right");
       }
    }
    答案就一样了
      

  4.   

    不错,要区分好== 和 EQUALS的区别
      

  5.   

    是因为String str1 = "abcd";  
         String str2 = "abcd";
    ···················
         String str1 =new String("abcd");
        String str2 =new String("abcd");
    一样在内存中分配的不是同一块内存地址,所以才会出现上面的结果,小弟拙见,不对请指出。谢谢
      

  6.   

    楼上说的不错。
    String str1 = "abcd";  
    String str2 = "abcd";
    是同一块内存地址
    String str1 =new String("abcd");
        String str2 =new String("abcd");
    就不同了
      

  7.   

    如RomandAccessFile所说,因为==表示两个对象的地址一样,而使用Equals表示两者的值一样
         String str1 = "abcd";  
         String str2 = "abcd";此时str2没有创建新的对象,而是把地址指向了已经创建的"abcd",所以str1和str2所指向的地址一样
        String str1 =new String("abcd");
        String str2 =new String("abcd");
    此时str1和str2都创建了新的对象,所以str1和str2指向的地址不一样,而此时str1.equals(str2)返回的却是true,因为其内容一样
      

  8.   

    equals()就是一个方法而已, 要怎么实现就可以怎么实现. 而==是Java内置的运算符, 你不能改变它.去看看Object类和String类的源代码就知道了.equals()方法继承自Object, 原本就是和==功能一样的, 如下:public boolean equals(Object obj) {
      return (this == obj);
    }但是String类覆盖了Object中的eqauls()方法, 使得它的功能扩充为比较两个字符串是否一样(即使不是同一个对象). 具体实现大家自己去看, 我就不贴了.
      

  9.   

    equals 比较值或地址
    ==     地址
      

  10.   

    首先要区分 == 对于对象来说是比较内存地址,equals是比较对象的值
    String str1 = "abcd";
    String str2 = "abcd";
    "abcd"是常量,被分配在静态内存区,str1和str2都指向这片静态内存区地质,所以==成立String str1 =new String("abcd");
    String str2 =new String("abcd");
    对象是用new创建出来,被分配在堆内存区,每个new出来的对象,分配的堆内存地址是不一样的,所以==不成立,但是两个对象的值是相等的,所以equals成立
      

  11.   

    qybao的解释清楚明了,就是这个原因,要分清楚==和equals的区别
      

  12.   

    我才搞JAVA的时候也犯过这个错,一定要记得==和equals的区别啊!!呵呵…………