String s1 = "Hello";
    String s2 = "hello";
    String s3 = s1.toLowerCase();
    String s4 = s2.toLowerCase();        System.out.println(s2 == s3);
        System.out.println(s3 == s4);
        System.out.println(s2 == s4);
false
false
true
我想问,3次引用地址的比较,为什么是false,false,true?
为什么s2和s4的地址就是相同的,而2和3,3和4就不同?

解决方案 »

  1.   

    s1==s2不用比,一看就知道是falses3和s4为什么引用地址不同?都是hello我希望真正懂得人能说出道理
      

  2.   

    值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。
    显然,当equals为true时,==不一定为true;这么跟你解释吧:
    equals它是java.lang.Object类中的一个方法。
    当你写成这样,不是去定义成变量,而是定义成对象后,在去比较试就可以明白了:String s1 = new String("str");
    String s2 = new String("str");
      

  3.   

    我们知道
    String s2 = "hello";
    之后再写
    String s4 = "hello";
    的时候,其实java并没有新开一块内存,而是将s4的指向了s2那么再来看
    String s3 = s1.toLowerCase();
    这句运行完之后s3变成了hello,但为什么java没有将之前已存在的s2的地址指向给s3呢?
      

  4.   

    你都说了是地址比较,干嘛还要用“==”呢?
    都跟你说了“==”和equal的区别,怎么就是不懂呢?
      

  5.   

      String s1 = "Hello";
      String s2 = "hello";
      String s3 = s1.toLowerCase();
      String s4 = s2.toLowerCase();  System.out.println(s2 == s3);
      System.out.println(s3 == s4);
      System.out.println(s2 == s4);
    false
    false
    true
    我想问,3次引用地址的比较,为什么是false,false,true?
    为什么s2和s4的地址就是相同的,而2和3,3和4就不同?
     
    s2和s4地址相同,String s2 = "hello";String s4 = s2.toLowerCase();
    查看jdk toLowerCase()方法,返回的是 return this; 所以是相同的
    然而2和3 为什么不同,String s2 = "hello"; 
      String s3 = s1.toLowerCase();
    原因是s3是在运行期生成的新对象 return new String(0, count+resultOffset, result);
    所以不同
    而3和4同上
      

  6.   


    地址比较用“==”,值比较才用equal
    好像你弄反了?
      

  7.   

    String.toLowerCase();该方法如果原来都是小写,返回的还是原来的对象,而如果有改变,会new出来一个String,所以地址不同了。
    参考源码 public String toLowerCase(Locale locale) {
    if (locale == null) {
        throw new NullPointerException();
            }        int     firstUpper; /* Now check if there are any characters that need to be changed. */
    scan: {
        for (firstUpper = 0 ; firstUpper < count; ) {
    char c = value[offset+firstUpper];
    if ((c >= Character.MIN_HIGH_SURROGATE) &&
        (c <= Character.MAX_HIGH_SURROGATE)) {
        int supplChar = codePointAt(firstUpper);
        if (supplChar != Character.toLowerCase(supplChar)) {
            break scan;
        }
        firstUpper += Character.charCount(supplChar);
    } else {
        if (c != Character.toLowerCase(c)) {
            break scan;
        }
        firstUpper++;
    }
        }
        return this;//把本身返回
    }        char[]  result = new char[count];
    int     resultOffset = 0;  /* result may grow, so i+resultOffset
        * is the write location in result */        /* Just copy the first few lowerCase characters. */
            System.arraycopy(value, offset, result, 0, firstUpper); String lang = locale.getLanguage();
    boolean localeDependent =
                (lang == "tr" || lang == "az" || lang == "lt");
            char[] lowerCharArray;
            int lowerChar;
            int srcChar;
            int srcCount;
            for (int i = firstUpper; i < count; i += srcCount) {
        srcChar = (int)value[offset+i];
        if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
            (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
    srcChar = codePointAt(i);
    srcCount = Character.charCount(srcChar);
        } else {
            srcCount = 1;
        }
                if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA
                    lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
                } else {
                    lowerChar = Character.toLowerCase(srcChar);
                }
                if ((lowerChar == Character.ERROR) ||
                    (lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
                    if (lowerChar == Character.ERROR) {
                        lowerCharArray =
                            ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
                    } else if (srcCount == 2) {
        resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount;
        continue;
                    } else {
        lowerCharArray = Character.toChars(lowerChar);
    }                /* Grow result if needed */
                    int mapLen = lowerCharArray.length;
    if (mapLen > srcCount) {
                        char[] result2 = new char[result.length + mapLen - srcCount];
                        System.arraycopy(result, 0, result2, 0,
                            i + resultOffset);
                        result = result2;
    }
                    for (int x=0; x<mapLen; ++x) {
                        result[i+resultOffset+x] = lowerCharArray[x];
                    }
                    resultOffset += (mapLen - srcCount);
                } else {
                    result[i+resultOffset] = (char)lowerChar;
                }
            }
            return new String(0, count+resultOffset, result);//直接返回新String
        }