String a = "JAVA";
String b = "JAVA";
String c = new String("JAVA");
String d = "JA";
String e = "VA";
String f = "JA"+"VA";
String g = d+e;
String h = c; 
System.out.println(a==b);//TRUE
System.out.println(a==c);//FALSE
System.out.println(a==f);//TRUE
System.out.println(a==g);//FALSE
System.out.println(c==f);//FALSE
System.out.println(c==g);//FALSE
System.out.println(c==h);//TRUE
//为什么a==g是FALSE呢?

解决方案 »

  1.   

    字符串是对象
    对象比较要用equals
      

  2.   

    System.out.println(a.equals(g));//这样就是true了
      

  3.   

    因为a==g是引用比较当然false
    要a.equals(g)才是true
      

  4.   

    a==g比的是内存地址,a.equals(g)才是比里面的值
      

  5.   

    //以下是一位朋友给我的解释,不知道各位有何意见?
    //为什么A==G
    因为a和b是常量字符串"java",编译器在编译时做了自动优化,将a和b指向了同样一个地址,但g是计算结果,不具确定性,编译器无法提前知道取值,当然不可能做相应的优化,指向同一个地址.因此,g指向的是另外一个地址. 
    //为什么A==F?
    f当然是对了,f是常量字符串连接,编译器在编译时首先会做"JA" + "VA"这一步,结果不就是"JAVA"嘛 
      

  6.   

    a==g比的是是否引用的同一个对象,a.equals(g)才是比里面的值!
      

  7.   

    同意它们存的地方是不一样的
    "JAVA"这种好象叫做字符常量,放在全局区的?
      

  8.   

    因为A和G它们是指同一个对象,而内容不是一样.所以是false  我也不知道是不是这样的..我也是初学者
      

  9.   

    这个很简单啊,因为二者内存地址不一样!在String 用==号的话,是比较内存地址,equals方法比较内容是否相同。
    String a = "JAVA";
    String g = d+e;跟String f = "JA"+"VA";
    是不相同的,String g = d+e;相当与new了一个String 对象,所以重新分配了内存。
    如果你换成String g = d+"VA";跟a==g的值依然是false,这也是new了一个对象。
    所以内存地址不相同。
    楼主的String f = "JA"+"VA";这一条语句,可以改为String f = "JAV"+"A";
    String f = "JAVA";等等这种字符串拼接起来的效果是一样的。跟String g = d+e;完全是两种不同的方式。
      

  10.   

    上面的表述好象有点混乱,哈哈。
    只要搞清楚用Stirng 类的两个构造函数,当然肯定也用到了new,肯定产生一个新的对象,分配新的内存地址。表达士(d+"VA")不是常量表达士,因此也产生了一个对象,相当于new。用常量创建的都是同一个interned字符串,所以内存地址相同。
    string类比较特别,有问题可以在论坛里搜下,以前有很多类似的问题,也有很多经典的答案。
      

  11.   

    ==好像是比较两个对象的内存地址是否相同
    很明显上面的内存地址不同啊
    你用eques()方法比较是比较他们的内容的
      

  12.   

    字符串例如"abc",用==号是表示比较的是abc外面的壳,孔子曰:叫首地址;equals,是比较壳里面真实存在的东东.这里就是"abc";
      

  13.   

    007cs(syan) 
     
     
       ==好像是比较两个对象的内存地址是否相同
    很明显上面的内存地址不同啊
    你用eques()方法比较是比较他们的内容的
      
     支持
      

  14.   

    == 是比较的对象指向的内存区域
    equals,相当于调用了每个对象的toString()方法,然后再比较
    你可以给两个绝对不一样的对象加同样返回值的toString方法
    再调用equals(),100%是true
      

  15.   

    s风格不管发表 根本法风格吧cfgb地方反对个爆发 突然感工人日提高搞活共同如果个恢复提高人而和研讨会有突然突然个广泛突然突然突然,后天内,后天,例如讨论;了;用途突然个骆驼绒了;突然突然感了;突然后果表面搞活立刻台了;和了;了;和;老太爷了; 风格;;搞活土偶批改反抗浪费风格风格看来广泛没广泛比较看来搞活立刻后果后果立刻法律;客观法兰盘;广泛看来发挥突然感棵乐观如同立刻美丽风格广泛吧搞活吧,了,搞活立刻大师傅d渴望了;看来
      

  16.   

    <<java虚拟机>>有带一个java virtual machine的模拟器,楼主跟着走一遍即可
      

  17.   

    THINKING IN JAVA中有详细的解释
      

  18.   

    这么简单的问题这么多人抢着答啊,老子问的难度问题却无人问津,CSDN的牛人一般只看贴不回的,哈哈
      

  19.   

    谁有听过JAVA字符串池吗 ?http://www.google.cn/search?hl=zh-CN&newwindow=1&q=JAVA%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%B1%A0&meta=
      

  20.   

    http://book.csdn.net/bookfiles/135/1001354627.shtml问题正解应该是这个吧
      

  21.   

    LZ首先应该分清 reference 和 value 的关系
      

  22.   

    简单问题!
    呵呵,接分!
    一般对象比较用equals()
    a.equals(b)....true;
    a==b 是比较两个对象的地址(可以这样理解),肯定false
    除非年是原始类型可以这样比较

    char a ='a';
    char b= 'b';
    a==b --true;
      

  23.   

    ==  比较的是两个对象,而EQUAL比较的是两个对象中的内容
      

  24.   

    a==g是比较对象的引用
    要比较对象的值要用equals
      

  25.   

    d+e生成新对象了,和a的地址不一样了
      

  26.   

    不同对象的比较要用 equal
      

  27.   

    主要是要搞清楚==与equal使用的区别
      

  28.   

    A==B是用来比较A和B的引用是不是一样的,也就是说A的内在地址和B的内存地址是不是一样的,它们如果指向的如果是同一个对象,就是true,如果想比较A和B的内容是否相等,就用A.equals(B),这是用来A对象和B对象的内容是不是一样的。
    欢迎大家参与程序群的讨论,共同进步!
    群号:32998944(程序人生)
      

  29.   

    String a = "JAVA";
    String b = "JAVA";//a==b是成立的,因为都是直接量。JVM为了优化,a,b两个引用变量指向同一个对象,如果你要
    a=f的唯一办法是
    f.intern();
    a==f就是TRUE了。
      

  30.   

    String a = "JAVA";
    String b = "JAVA";
    String c = new String("JAVA");
    String d = "JA";
    String e = "VA";
    String f = "JA"+"VA";
    String g = d+e;
    String h = c; 下面逐一的说:System.out.println(a==b);//TRUE   通过String str=""这种方式获得的相同内容的String指向同一个intern对象
           
    System.out.println(a==c);//FALSE  new String()方式生成的是一个新的对象,可通过intern()方法指向同一个intern对象System.out.println(a==f);//TRUE "JA"+"VA";会在编译期换为"JAVA"System.out.println(a==g);//FALSE d+e后,是新的String了,不会在编译期完成
    System.out.println(c==f);//FALSE 这个很简单,地球人都知道
    System.out.println(c==g);//FALSE 这个很简单,地球人都知道
    System.out.println(c==h);//TRUE 这个很简单,地球人都知道