String str="hello";
  String s1="hel"+"lo";
  String s2="hel";
  String s3="lo";
  System.out.println(str==s1);
  System.out.println(str==(s2+s3));
   为什么结果不一样呢 ??
   而分别是 true false;
  加号起的作用不一样吗??还是别的什么原因??

解决方案 »

  1.   

    大哥str==s1这是个判断真假的式子,只有TRUE 和FALSE两种结果
    要输出就System.out.println(str);
      

  2.   

    String在java中是一个类,不是一个基本类型,"=="判断的是两个变量值是否相同,而类的值其实是指向该类的指针值.
    在String的初始化时,系统会先查找是否已经存在相同的String,如果存在了,直接指向到这个String,所以str和S1会相等,第一个是true.
    而在s2+s3在并不会这样,而是直接重新new一个String,这个String值是"hello",但是他是新生成的,地址和str指向的肯定不一样,所以第二个是false.
      

  3.   

     System.out.println(str.equals(s2+s3));这样就是TRUE
      

  4.   

      String s1="hel"+"lo"; 难道没有创建新的对象吗?
       我记得一本书上说的 凡是 + 号创建的对象都不是共享的
      

  5.   

    我来给你解释一下吧, 首先String类型是一个引用类型,不是基本类型,所以==操作符对于String对象来说是比较对象间的内存区是不是相同,其实针对你的代码
    String str="hello"; //编译的时候就是str = "hello" 保存在字符串池中
    String s1="hel"+"lo"; //编译的时候就是s1 = "hello" 指向字符串里的str
    String s2="hel"; //编译的时候就是s2 = "hel" 
    String s3="lo"; //编译的时候就是s3 = "lo" 
    s2+s3      //编译的时候 不知道s2+s3是多少  只有在运行完之后才知道是hello
      

  6.   

    这不是+问题,而是编译器编译的时候做了优化
    String s1="hel"+"lo"; 编译后就变成了String s1="hello"; 
    所以出现了你看到的结果
      

  7.   

    ===蜗牛小屋,编程开发,Java,j2se,j2me,j2ee,新手入门,高级技术,核心技术,资料,技术文章,个人收藏,开发笔记,网络编程 http://www.pjwqh.cn ===
      

  8.   

    支持2楼的
    ==比较应用类型的变量,比较的是引用是否相同,即是否引用同一个对象
    s1,str这种引号括起来的字符串直接量(或者叫规范化字符串),或者是+号连接起来的
    在编译的时候,已经在class文件的CONSTANT_STRING_INFO表中了,也就是俗称的字符串常量池了
    在class文件加载的时候,这些对象会被创建,而s2+s3是在运行到那一句时,临时创建的
    所以前一个为true,后一个为false
    详细的可以看我的另外一片帖子,我对String的一些见解
    http://topic.csdn.net/u/20080725/04/97b56b19-cd16-4167-9a31-7c5201974627.html
    6楼是我的总结,发贴的时候走了些误区
      

  9.   

    判断方式不对,用该用 String.equals()
      

  10.   

    在JAVA执行时会维护一个String池。对于一些可以共享的字符对象,会先在池中查找是否存在相同的内容,如果有就直接返回,而不是创建一个新的String对象。所以。你的Str和Str1是指向同一个对象。而使用+串联字符串会产生一个新的字符串对象。所以就有TRUE 和 FLASE的情况。“==”在JAVA中是判断两个是否引用同一个对象,而不是比较2个是否相等。要比较是否相等可以用equals
      

  11.   

    2楼说的很正确,string比较特殊,如果你用equals的话,那么就两个结果都相同了..
      

  12.   

                      String str="hello"; 
      String s1="hel"+"lo";   //后面两个不是变量是两个常量
      String s2="hel"; 
      String s3="lo"; 
      System.out.println(str==s1); 
      System.out.println(str==(s2+s3).intern()); //最后相加是s2、s3是变量在运行时刻才能知道,也就是s2+s3是在堆里创建的
    这个是String Pool问题! 
    当然用 equals也行!
    http://blog.csdn.net/songshuxing/archive/2008/08/08/2786565.aspx
    我这有!如果还不清楚看看吧
      

  13.   

    我也问一下,那StringBuffer这个类
    StringBuffer a=new StringBuffer("a");
    StringBuffer b=new StringBuffer("a");

    System.out.println(a==b);
    System.out.println(a.equals(b));
    输入是false false;
    第二个是false为什么?
      

  14.   


    没覆写equals()的话就是比较reference而不是内容,因为Object中equals()比较的是reference可能是StringBuffer中没有覆写equals()???
    不敢确定
    又好象在哪看过,类库中的类都有覆写equals()
      

  15.   

    String 是个类,而==比较的一般是地址,若想让其都显示true那么就调用equals()方法
      

  16.   

    他是直接继承Object类的equals方法的
      

  17.   

    引用用==来比较,只有比较的引用指向同一个对象才返回true
      

  18.   

    equals 是string的方法不是StringBuffer的方法,至于为什么不会产生异常我也不清楚.
      

  19.   

    string型比较只能用equals ,不能用==
    ==比较的是地址
      

  20.   

    刚才看了一下StringBuffer的源代码,StringBuffer的源代码中没有重写equals方法,他是继承自AbstractStringBuilder类的,而这个抽象类中有这么一句:Needed by <tt>String</tt> for the contentEquals method.所以使用了equals方法也是比较他们的引用的,而不是和String一样使用equals比较的是内容
      

  21.   

    “==”在用于比较两个引用时,比较的是两个引用所参考的对象是否为同一对象(引用所参考的对象的地址值是否相同),如LZ的代码中,由于str和s1参考的是同一对象(内存地址相同),所以str==s1;s2+s3:经“+”连接后形成了新的对象,它的地址值既不等于str,也不等于s2或s3, 而是一个全新的对象(尽管内容也是"hello");若要比较两个引用参考的对象内容是否相同可使用对象的equals( )方法。
      

  22.   

    ==是比较引用的指向是否相等.
    equals是比较内容是否相等.
    你把System.out.println(str==(s2+s3)); 
    改成System.out.println(str.equals(s2+s3));
      

  23.   

    有一点我听的明白了点,就是JAVA编译器做了优化,当判断到s1也是个"hello"字符的时候,就将s1指向了str.不过还有疑惑,它们的内存地址都应该在堆里吧!用了不同的变量名,为什么会产生一样的堆内存地址呢!
      

  24.   

    判断两个字符串是否相等通常用equal()方法
    ==通常是比较HashCode值
      

  25.   

    注意 string的immtable特性,不知道单词拼错了没 ,呵呵
      

  26.   

    用这个比较就可以了str.equals()
      

  27.   

    ==是关系运算符,这有个知识点就是比较==和equals()方法之间的区别。
    ==是判断两个字符串的值是否相等,equals()是判断两个字符串的内容是否相等。
    有的时候==是不可以用的,当字符串是经过运算得来的时候,==很可能失效。
    一般采用equals()方法,其实还有其他方法,具体的看java 核心技术。