在做一个东西,遇到了一个挺诡异的问题的,
如果字符串用单个字符累加起来,
结果会与字符串不相等。
我简化了下,也就是下面的代码:
String str1="";
str1+='a';
str1+='b';
str1+='c';
String str2="abc";
System.out.println(str1==str2);结果是false 
谁能帮我解释下吗?
最好能帮我给出解决方法,使得str1== str2能成立,
比如str1要怎么转换?

解决方案 »

  1.   

    http://so.csdn.net/search?t=thread&q=string%20%E7%9B%B8%E7%AD%89
    楼下不用回复了
      

  2.   

    字符串对象的值永远不会改变,改变的是引用了不同的字符串对象。str1 = new String("a")+new String("b")+new String("c");
    str2 = new String("abc");str1 和 str2 是两个不同的对象;
    要比较对象的值就用str1.equals(str2);
      

  3.   

    因为str1=="abc",而str2=="abc\0",str2隐含了字符串结束标志'\0';
      

  4.   

    比较值是不是相等请使用 equals 方法
      

  5.   

    这里能不能不要再出现 String 产生了几个对象、== 为啥是 false、为啥是 true 的问题了呀?
      

  6.   

    equals()比较,==是比较内存地址是不是一样的
      

  7.   

    你是不是想误导人???你从哪得知,str1没有字符串结束标志'\0'的?
      

  8.   

    String str1="";
    str1+='a';
    str1+='b';
    str1+='c';
    String str2="abc";
    System.out.println(str1==str2);最后str1 指向 data meg(数据存储区)的" abc",str2 = "abc";  内容不同肯定不可能“==”,即使内容相等最后的结果也不可能是true,因为他们的内存指向不一样,这种题试着分析内存的指向和存储变化比较好~
      

  9.   

    字符串比较是否相等,不能用“==”,应该用equals方法
    System.out.println(str1==str2);----改为System.out.println(str1.equals(str2));
    这样就true了
      

  10.   

    string每+一次都会new一个新的字符串出来,用==比较比较的是内存地址,所以是false
      

  11.   

    说的简单点吧,equal是比较值是否相等,==是比较地址是否相等
      

  12.   

    ==是比较的是不是两个相同的对象,你说怎么能相等,概念都没搞懂,晕
    想相等的话调用str1的public String intern()方法,没测试,自己去试试,OK?
      

  13.   

    最好用equals比较,String中重写了equals方法,==是比较的地址
      

  14.   

    str1 与 str2 的值是相等的.
     但是你的比较方法是比较它们的内存地址.
    当然会返回false了
      java里比较字符串的值是用equals
    str1.equals(str2) 这样就能返回TRUE了
      

  15.   

    用等号比较的是两个对象,用equals方法比较两个对象的内容
      

  16.   

    基本数据类型的比较:只能使用==
    字符串的比较:equal()方法比较的是对象的内容是否相等,==比较的是对象的引用是否相等
    对象的比较:建议重写equal()方法
    String str1="";
    str1+='a';
    str1+='b';
    str1+='c';
    不如将str1定义为StringBuffer
    String每次使用+=要耗费的内存比StringBuffer多
      

  17.   

    这是大问题,如果想彻底弄清楚请读深入java虚拟机这本书
      

  18.   

    具体str1是否等于str2要看不同版本的java虚拟机的情况,在有些虚拟机下它会自动的把值相等的不同对象指向同一个值,这样的话str1=str2就成立,有些情况则不成立,就想楼主遇到的这种情况
      

  19.   

    首先String 这个类是extens Object 这个类的;本来equals和==都是比较二个是否是同一个对象,但是equals覆盖Object 中的equals方法结果变成了比较二个对象内容是不相同就行了。因此用==是false;用equals就是true;当然你也可以自己覆盖object的equals的方法比如下面的覆盖方法
    public boolean equals(){
      boolean tr=true;
     return tr;
    }
    这样写了后,任何二个String用equals都是返回true;(好像说到别的地方去了....)
      

  20.   


    以前都用c++,第一次用java,没想到问题这么容易就处理好了。
    另外,哪门语言哪个时刻不会出现新手?烦请不要用这样的语气来打击新手。对你来说你见过很多次这样的白痴问题,
    但对于问问题的人来说绝对是第一次,不可能是第二次!不回复没人当你是哑巴。
      

  21.   


    确实是自己查了很久,先去javaeye,最后才来CSDN的。
    一直习惯c++的思维方式,哪里会想到java有这样的区别。虽然不喜欢你跟5L的回答方式,但是还是很感谢其他人能热心回复这么简单的问题的。哪个新手没白痴过?谁不是从不懂到懂的?
      

  22.   

    java核心技术 里在讲过每个知识点后会给你一个提示,与c++的区别,你可以去看看
      

  23.   

    我只能说 我受教了··我也是新手不之道哪些 不耐烦的人  是不是 出生就是java高手···嫌烦 你可以 不回答啊难道 你不回答 就显示不出你是高手了?虚荣心真强
      

  24.   

    public class cesi
    {
    public static void main (String args[]){
    String str1="";
    str1+='a';
    str1+='b';
    str1+='c';
    String str2="abc";
    System.out.println(str1.equals(str2));
    }
    }
      

  25.   

    ==比较的是地址,str1和str2是两个对象,所以地址不同
    用equals方法比较对象的值
      

  26.   


    反编译之后,你就知道为什么是false了。
      

  27.   

    ==比较的是地址,str1和str2是两个对象,所以地址不同
    用equals方法比较对象的值
    你把"=="改成"equals"   结果就是true.
      

  28.   

    扯淡  String  连接池看下 !
      

  29.   

    tong eques
    这个方法
    == 在这里比较了对应字符串的内存地址