一、    String java="java",va="va";
        System.out.println(java=="java");
        System.out.println(otherobj.java==java);
        System.out.println(java==("ja"+"va"));
        System.out.println(java==("ja"+va));
       请问,运行后
               true
               true
               true
               false
       为什么最后的结果是false呢?
二、 String a = new String("foo");
     String b = new String("foo");
     String c="foo";
     String d="foo";
    System.out.println(a==b);
    System.out.println(c==d);
    运行后
          false
          true
    请问这里的区别是什么呢?

解决方案 »

  1.   

    String a = new String("foo");是定义了2个对象,
    a是指向foo这个对象的一个引用,a.equals(b);
    ==一般比较的是对象的地址,
            System.out.println(otherobj.java==java);
               System.out.println(java==("ja"+va));这2个明显有区别啊
      

  2.   

    请问zuguanqun(小群) ,如果==比较的地址,那么otherobj.java==java应该是不同的地址吧,为什么还是true呢,也就是说  String c="foo";这里的"foo",是在堆里么?
      

  3.   

    请问"foo"是一个字符串对象么,请问String c="foo";String d="foo";是指向的一个对象么?
      

  4.   

    String用法应该是类似于数组,Think in java里面就有介绍
    String str1 = new String("ok");
    和String str2 = "ok";
    是不同的,前者是引用,而后者则不是!
    我是这样理解的不知道对不对?
    至于System.out.println(java==("ja"+va));为false
    是不是有隐式类型转换使得"ja"+va转成了引用?
      

  5.   

    System.out.println(java==("ja"+va));这里: "ja"+va  生成了一个新的对象.
    String java="java",va="va";
            System.out.println(java=="java");这里相等是因为:java在内存中只保存一份字符串常量,第一行的java变量和第二行的"java"指向同一个地址.所以==
      

  6.   

    同样关注问题有没有人解释怎样理解java==("ja"+"va")是true("ja"+"va")不会生成新对象吗
      

  7.   

    这种问题真的很难解释。你得先了解JAVA和JVM
    编译期和运行期这些基本概念
      

  8.   

    字符串的比较不能用==,只能用equals(),因为==比较的对像的引用,两个字符串即使值相同,引用不同,用==比较也是不同的。而equals()只是对值比较。好好查一些这 些资料,楼主很快就明白了。
      

  9.   

    String a = new String("foo");
         String b = new String("foo");
         String c="foo";
         String d="foo";
        System.out.println(a==b);
        System.out.println(c==d);
        运行后
              false
              true
        请问这里的区别是什么呢?
      

  10.   

    这种问题真的很难解释。你得先了解JAVA和JVM
    编译期和运行期这些基本概念
      UP.
    建议楼主先看好 关于初始化内存顺序。
      

  11.   

    waiting20052005(好好学习,天天向上;认真读书,不搞对象!) ( ) 信誉:100  2006-08-18 10:34:00  得分: 0  
     
     
       String a = new String("foo");
         String b = new String("foo");
         String c="foo";
         String d="foo";
        System.out.println(a==b);
        System.out.println(c==d);
        运行后
              false
              true
        请问这里的区别是什么呢?  
     
     String c="foo";
         String d="foo";  指向的是同一个内存地址。
    String a = new String("foo");
         String b = new String("foo");  不是指向同一个地址。
      

  12.   

    String类型如果采用 String a = "foo" 的定义方式,JVM是对"foo"做了缓存的,以后如果有 String b = "foo",指向的其实是同一个内存地址;采用String a = new String("foo"),这个地球人都知道,分配新内存地址存对象,和前面的内存地址就不同了
      

  13.   

    连个Hash的字样都看不到,怎么让我认同各位呢?
    Java在32位OS下,是用int来表示Hash值的。
    这只是在理论上可以用equals进行字符串比较,但是这个是不准确的做法。
    还是要坚持用compareTo
    因为两个相同的字符串具有相同的Hash是在一定条件下才成立的。
    而String a==b这样的代码永远都不要写出来。基本没用用的。
      

  14.   

    System.out.println(java.equals("ja"+va));
      

  15.   

    高手就是高手。。
      healer_kx(甘草(朝圣中... ...)) ( ) 信誉:100  2006-08-18 10:59:00  得分: 0  
     
     
       连个Hash的字样都看不到,怎么让我认同各位呢?
    Java在32位OS下,是用int来表示Hash值的。
    这只是在理论上可以用equals进行字符串比较,但是这个是不准确的做法。
    还是要坚持用compareTo
    因为两个相同的字符串具有相同的Hash是在一定条件下才成立的。
    而String a==b这样的代码永远都不要写出来。基本没用用的。
      
     
      

  16.   

    这个是跟String 的内存地址分配有关。
    "ja" + "va" 由于全部都是static final String 所以它会存入静态池中
    而"ja" + va 由于va 是String 对象,所以在这里会构建一个新的String 对象
    你可以试试 
    System.out.println(java==("ja"+va).intern());
    会是什么样的结果呢?呵呵
    事实上,为了在高并发的系统中,防止产生的String 对象占用内存过多,在某些地方需要用intern() 方法进行优化处理,而且还可以大大提高字符串比较效率哦
      

  17.   

    提到intern() 这个方法的人,应该是把String吃透了,说出来的话是可信的~