String s1 = "ja";
String s2 = s1+ "va";
String s3= "java";

System.out.println(s2==s3);
输出为什么为true

解决方案 »

  1.   

    ...靠。相当于s2="ja"+"va"="java",而这种形式的定义是在字符串常量区的,再定义一个s3="java"也是指向的同一个字符串常量区的地址块,而不是新生成的地址,也就是这两个定义指向的都不在堆区,而是字符串常量区。所以==是相等的,equals也相等
      

  2.   

    亲,我把你代码复制运行了一下,结果是false!!!!!!!!
      

  3.   

    看到这里我就一直在笑啊亲,不是笑你,而是笑你的笔记做的太好了啊!但是却是个false!
      

  4.   


    package com.riyun.test;public class Demo { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1="va";
    String s2="ja"+s1;
    String s3="java";
    System.out.println(s2==s3);//false
    System.out.println(s2.equals(s3));//true

    StringBuffer sb1=new StringBuffer("va");
    StringBuffer sb2=new StringBuffer("ja");
    StringBuffer sb3=new StringBuffer("java");
    System.out.println(sb3==sb2.append(sb1));//false
    System.out.println(sb3.equals(sb2.append(sb1)));//false }}我也不知道为什么,求大神!
      

  5.   

    字符串引用的是个地址,地址指向“ja”、“va”、“java”。地址肯定不相等。没见过用string==string这种比较方法的。所以提供了equal方法。
      

  6.   

     String s2="ja"+s1;
    这个代码的执行过程是这样的
    StringBuffer value = new StringBuffer();
    value.append("ja");
    value.append(si);
    s2 = value.tonString();所以S2和S3是不同的对象,那就不同了 就出现false。我的理解不对请大家改正
      

  7.   

    汗、、、写错单词了、、
    String s2="ja"+s1;
    这个代码的执行过程是这样的
    StringBuffer value = new StringBuffer();
    value.append("ja");
    value.append(s1);
    s2 = value.toString();
      

  8.   

    如果是equals()方法,两者是相等的,因为equals()在这儿比较的是字符串的字面值,而“==”对于原生数据类型,比较两边的值是否相等,对于引用类型比较的是是否指向同一个对象,也就是两边的地址是否相等
      

  9.   


    String s1="java";
    String s4="java";
    System.out.println(s1==s4);
    这样才是true的
      

  10.   

    只知道创建一个String对象,会把对象放入String常量池中,然后==比较的是地址,那么"ja"+s1这个的值是java,没错啊,不清楚为什么不等于s3.
      

  11.   


    String s1 = "ja";
    String s2 = s1+ "va";
    String s3= "java";System.out.println(s2==s3);
    ==比较的是内存地址,s2是通过s1+“va”然后放在s2这个变量里面的,很明显和s3指的内存地址是不一样的,所以结果是false啊。要比较两个字符串的值是否相等应该用equal。
      

  12.   

    和字符串的不变性有关,
    String s2 = s1+ "va";并不是从字符串对象池中找了,s1+"va" 由于字符串s1改变了,所以创建了个新对象。
      

  13.   

    我的理解是这样的:关于字符串的创建有两种方式:
    1.String s1 = new String("java");
    2.String s2 = "java";两种创建方式在内存中是有区别的:
    1.对于String s1 = new String("java");用new创建一个String对象,是在内存的堆中,开辟空间,创建一个String类型的对象,而s1是这个对象的一个引用,s1指向该String对象的地址。
    用new创建对象,new多少次,就产生多少个对象。
    2.对于String s2 = "java";在创建对象时,先查看堆中,有没有与将要创建对象“java”相同的对象存在,如果有,不会真正的创建一个对象,而是这个引用s2直接指向已存在的那个对象;如果没有,就才创建一个对象。上面所说的,对象的引用(s1,s2),是存放在栈中的
    引用指向该对象(“java”)的地址,就是将对象的地址,赋值给引用。
      

  14.   

    这是字符串中的“==”和equal()的问题,==比较的是字符串的地址,equal比较的是内容。
      

  15.   

    String s1 = "ja";//堆内存中创建一个对象里面的内容为"ja",栈内存的s1指向该对象String s2 = s1+ "va";//堆内存创建另外一个对象里面的内容为"java",栈内存的s2指向该对象String s3= "java";/*由于是String str="";格式,故堆内存不会创建一个新对象,开始会从堆里的一个池里去找是否存在字符串为java的对象,这时s2刚好满足,故找到s2并赋给s3,这样就形成了s2,s3同时指向同一个对象,故他们相等为true.*/
      

  16.   

    String s1 = "ja";//堆内存中创建一个对象里面的内容为"ja",栈内存的s1指向该对象String s2 = s1+ "va";//堆内存创建另外一个对象里面的内容为"java",栈内存的s2指向该对象String s3= "java";/*由于是String str="";格式,故堆内存不会创建一个新对象,开始会从堆里的一个池里去找是否存在字符串为java的对象,这时s2刚好满足,故找到s2并赋给s3,这样就形成了s2,s3同时指向同一个对象,故他们相等为true.*/