String a = "ab";
String b = "a" + "b";
System.out.println(a==b);
true or false?大家可以在自己的机子上试一下,看一下结果,并主意自己用的JDK是哪个版本的?可以发结果上来大家一起探讨!!

解决方案 »

  1.   

    很基础的东西,也是csdn java版最火的问题之一 
      

  2.   

    这个倒是好理解,我再出一个吧String a = "abc";
    String b="ab";
    String c=b+"c";
    System.out.println(a==b);
    true or false?
      

  3.   

    String a = "abc";
    String b="ab";
    String c=b+"c";
    System.out.println(a==c);
    true or false?上面写错了
      

  4.   

    我的是 true JDK   这个版的jdk-7-ea-bin-b20-windows-i586-13_sep_2007
      

  5.   


    这个有意思 我把b和c都输出了 结果都是abc 
    可答案是false
    有意思
      

  6.   


    我还是认为是true,但是编译下来是false.....
    加上了
    System.out.println(a);
    System.out.println(c);
    输出均是abc
    为什么是false,求解
      

  7.   

    我觉得大家应该仔细查一下 java的String类型
    这样就应该好懂些 ,也学的深入些
    不要局限于这个具体的题目
    要由此题目进行引申
      

  8.   

    是不是说a和c的值相等(用equals判断是true);
    而a和c在内存中保存的首地址是不一样的
      

  9.   

    我看了下书
    String a = "abc";
    String b="ab";
    String c=b+"c";
    System.out.println(a==c);好像a是表示的是值,c是对象句柄,所以a==c就是false,不知道这个解释是否正确?
      

  10.   

    -_-||  我试过了  是true好不~~~~~
      

  11.   


    是true...刚才忘记按保存就直接编译了...汗死...不知道我13楼的解释正确否?LZ可以出来说下不?
      

  12.   

    equals的话肯定是true了,如果是==的话,个人感觉是false。前几天有个热贴是讨论这个问题的(近似这个问题吧)
      

  13.   

    JDK 1.5
    结果true个人认为这个可能和sun公司的对一些基础的内存的地址分配有关系。
    请LZ给出正确解释
      

  14.   

    上面两个例子里的“+”全是连接符, 如果把加号后面的字母,比如说“c"改成“    c”,输出的结果就都是false了
      

  15.   

    我来给各位解释一下吧
    String a = "ab"+"c";
    这里会被编译器自动优化成a = "abc";它是存在在栈中的
    String a="ab";
    String c=b+"c";
    这里,实际上a是一个对象了,那么+操作符会把结果放到堆内存中,这样,两块内存是不一样的,虽然内容是一样的
    所以它们比较就得到false了.
      

  16.   

    “abc”不在栈中吧。应该在静态区中的吧。
      

  17.   

    考试常考的东西,就是==与 equal()函数的区别...
      

  18.   

    考试常考的东西,就是==与 equal()函数的区别...
      

  19.   

    我觉得这是一个没有意义的问题,首先作为字符串用==比较,从规范的角度看只是比较地址相同,但并没有约定如何来存放这些字符串,也不保证在编译器相同的串就一定处于同一个地址;
    虽然现在在某个jre环境上得到某个值,如果将来编译器能够优化代码中的多余语句,情况又可能不一样;
    而且,如果项目中谁用这个方法来比较字符串是否相同,通常是要抓出来批斗的!
      

  20.   


    这个问题主要是让大家了解String的工作方式
      

  21.   

    我看到另一种说法,不知道那种更准确。
    String a = "ab"+"c"; 
    这时候生成的"abc"会放入StringPool,
    String a="ab"; 
    String c=b+"c"; 
    由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。
    即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。
      

  22.   


            String a = "abc"; 
            String b="ab"; 
            String c=b+"c"; 
            System.out.println(a==c);
            System.out.println(a.equals(c));
            a = "ab"; 
            b="a"+"b"; 
            System.out.println(a==b);
      

  23.   

    只来了2个月,就看见这问题出现了10多次,而且一出必火,太离谱了.
    即使不在java区翻已存在的提问,google下也不至于吧<(  ̄︿ ̄)︵
      

  24.   

    [Quote=引用 4 楼 rypgood 的回复:]
    Java codeString a = "abc";
    String b="ab";
    String c=b+"c";
    System.out.println(a==c);
    true or false?a,b,c都是对象的引用名称,显示用"=",是比较a,b,c是否引用同一个对象,使用"+"连接b,c,会在String 池里生成一个新的对象c,显然和a的引用对象不同,false.
    改为
    String a = "abc";
    String c="abc";
    System.out.println(a==c);
    true or false?结果为true。当有可以共享的字符串对象时,会先搜索String池,"abc"已经存在,所以在创建c时候,直接返回,a,c引用相同的对象
      

  25.   

    这样的问题长出点对自己深入了解JAVA的编程内涵有帮助
      

  26.   

    他们equals,而不是==,
    a和c在内存中是两个东西,而楼主的那两个是常量,存放在常量池中,比较方式不同
      

  27.   

    [我看到另一种说法,不知道那种更准确。 
    String a = "ab"+"c"; 
    这时候生成的"abc"会放入StringPool, 
    String a="ab"; 
    String c=b+"c"; 
    由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。 
    即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。】
    呵呵,确实是一种缓冲池技术,一些基本类型的封装类也有用的,这主要是内部如何实现的 问题
      

  28.   

    1楼是true
    String a = new String("ab");
    String b = new String("a" + "b");
    System.out.println(a == b);
    这么写就是false
      

  29.   

    如果把第三行改成:  String c="ab"+"c";
    会是true还是false呢?
      

  30.   

    如果把第三行改成:  String c="ab"+"c";
    会是true还是false呢?
      

  31.   

    True。我讲一下道理吧:
    String a = "ab";   //第一句在堆栈区放入一个名字为a,其内容指向数据区的一个字符串常量"ab"的地址。
    String b = "a" + "b";  //先计算"a" + "b" 其返回值必为字符串"ab",于是编译器就在数据区找是否已经存在"ab",显然已经存在,于是就把已有"ab"的传给堆栈区的b。
    System.out.println(a==b);//比较a与b存放的地址是否相同,经上面的分析得相同。
    见笑了!!
      

  32.   

    呵呵,看了大家这么多的评论,其实我也是只知道这个问题的答案是true,但是至于为什么我也不清楚了!但是这个题涉及到了java虚拟机的问题,我想肯定会对我们更加的了解java会有所帮助,所以希望大牛们多多发挥自己的智慧,新手学习中!!-_-
      

  33.   

    之所以这个题目这么有的讨论,是因为本身没有标准答案,除非在所有当今的JVM环境上全部测试,都得到同一个值!
    也许某一天这个帖子里的某位高人,自己实现了一个JVM,测试这个程序返回的就和大家现在的结论不一致,但是这绝不违反java规范!
      

  34.   

    java语言规范里还是有说明的,建议看看
      

  35.   

    String a = "ab"+"c";
    这时候生成的"abc"会放入StringPool(正解),
    String a="ab";
    String c=b+"c";
    由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。
    即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。
      

  36.   

    两者比较的不是数值,比较的是对象引用的地址,这里就是提出了equal方法和==的区别!
      

  37.   

    我还是新手。哈哈。看了上面的回答。我感觉我学到了很多呢。谢谢你们。不过,我看了。我还是支持FALSE
    毕竟我觉得他们指向了2块不同的内存地址。
      

  38.   


    agree.
    and if you want to compare 'equalsIgnoreCase' and '==' oprator, you can use code following to test.  String a = "abc";
    String b = String.valueOf(new char[] {'a', 'b', 'c'});
    //String b = "a" + "b" + "c";
    System.out.println(a==b);
    System.out.println(a.equalsIgnoreCase(b));
    results:
    false
    truethe value of b is the address of string representation of instance 'new char[]'.
      

  39.   

     肯定会是false,a和b是对象的地址,肯定是不等的。equal的话很难说
      

  40.   

    应该是false吧  ==是对比内存地址
      

  41.   

    应该是false吧  ==是对比内存地址
      

  42.   

    考试常考的东西,就是==与 equal()函数的区别... 答案为false
      

  43.   

    String a = "ab";
    String b = "a" + "b";
    System.out.println(a==b);
    这个是true
    String a = "abc"; 
    String b="ab"; 
    String c=b+"c"; 
    System.out.println(a==c); 
    这个是false 因为a变量引用的的地址是“abc“,而c引用的地址是b引用的地址,所以a和c不相同我提个问题
    String a=new String("abc");
    String b="abc";
    System.out.print(a==b);
    true 还是false
      

  44.   

    我认为是false
      因为String 是一个类
    类与类的比较是比较它们的内存地址,a 和c分别存在两个不同的地方
    结果也不会是一样的
      

  45.   

    研究过此类问题 是false
      

  46.   

    String str1="AAAA"; 
    String str2="AAAA";
    这种做法虽然变量名变来变去,但内存中对象仍只有一个,这种方法可以有效地节省内存空间和提高运行效率。String str1=new String("AAAA"); 
    String str2=new String("AAAA"); 
    这个了就是生成两个不同的对象 
    所以if(str1==str2){} 的结果应该是 false 
      

  47.   

    又是String   的常量池 问题。
      

  48.   

    再来一个旁例:[code]
    string _base = "ab";
    string _ext1 = "c";
    string _ext2 = "other";
    string comp1 = _base + "c";
    string comp2 = _base + _ext1;
    string comp3 = _base + _ext2;
    _base += _ext1;sysout(comp1 == comp2);
    sysout(comp1 == comp3);
    sysout(comp1 == _base);
    [code]
      

  49.   

    我记得这个问题在《Thinking in Java》中的一个例题出现过,当时我也很奇怪,后来baidu了一下,正如61,62l的解答。
      

  50.   

    String a = "ab"; 
    String b = "a" + "b"; 
    System.out.println(a==b); 
    这个是true 
    String a = "abc"; 
    String b="ab"; 
    String c=b+"c"; 
    System.out.println(a==c);
    这个是false,如果说c引用地址是b引用的地址的话,那么System.out.println(b==c);应该是什么结果呢
    我觉的c不是引用的b的地址。而是当一个对象+字符生成对象的时候会另建地址的
      

  51.   

    public class test1 {
    public static void main(String[] args) {
    String a="ab";
    String b="a"+"b";
    String f=b;
    System.out.println("a==b is "+(a==b));
    System.out.println("a==f is "+(a==f));
    String c="abc";
    String d="ab";
    String e=d+"c";
    System.out.println("c==d is "+(c==d));
    System.out.println("c.equals(e) is "+(c.equals(e)));
    }}
    结果:
    a==b is true
    a==f is true
    c==d is false
    c.equals(e) is true
    结论:
    在JAVA中,进行字符串比较,还是用equals()保险。
      

  52.   

    http://blog.csdn.net/ZangXT/archive/2008/10/11/3057471.aspx
      

  53.   


    beyond !
      

  54.   

    String类是一个很特殊的类,当对其进行赋值的时候,他就会重新实例化一个对象,所以,即使输出的内容一样,当时其实两个不同的对象,所以为FALSE
      

  55.   

    记得之前通过==来判断两字符串是否相等导致一直得不到想要的结果,后来才知道字符串的判等需要通过equals来判定。
    不过,刚才在机器上试了一下,竟然两个结果都是true,有点不理解了。
    为什么结果会与jdk的版本有关,真是搞不懂了