Java 调用toUpperCase函数后,这两个对象如何仍然相等

Java 调用toUpperCase函数后,这两个对象如何仍然相等,java,string,Java,String,我读到的是函数 toUpperCase实际上返回了一个新的String对象,我检查了Java.lang.String中的代码,它确实创建了一个新字符串 这是来自Java.lang.string类、方法toUpperCase的代码 int resultOffset = 0; char[] result = new char[len]; /* may grow */ 这是我现在的代码: String s1 = new String("THAT");

我读到的是函数
toUpperCase
实际上返回了一个新的String对象,我检查了Java.lang.String中的代码,它确实创建了一个新字符串

这是来自Java.lang.string类、方法toUpperCase的代码

        int resultOffset = 0;
        char[] result = new char[len]; /* may grow */
这是我现在的代码:

    String s1 = new String("THAT");
    String s2 = s1;
    System.out.println(s1 == s2); // true
    s1 = s1.toUpperCase();
    System.out.println(s1 == s2); // true, how is that?
第一个(s1==s2)返回true,这是显而易见的。但是,第二个怎么也能返回true呢?在toUpperCase方法之后,s1不应该成为一个新字符串吗?而s2仍然指向旧的s1。因此,它们的内存位置应该不相同,因为
==
比较内存位置。结果应该是错误的


我知道我的论点在某些方面是错的,但那一点在哪里呢?

因为
s1
已经是大写了。JVM返回相同的
intern
d
String
。您可以显式地将其设置为新的。像

String s1 = "THAT"; // <-- no need for new String here.
String s2 = new String(s1);
System.out.println(s1 == s2);

在这两种情况下,在JDK
String.toUpperCase(Locale)
方法体中都会得到
false

,如果字符串都是大写,则返回相同的字符串

        /* Now check if there are any characters that need to be changed. */
    scan: {
        for (firstLower = 0 ; firstLower < len; ) {
            int c = (int)value[firstLower];
            int srcCount;
            if ((c >= Character.MIN_HIGH_SURROGATE)
                    && (c <= Character.MAX_HIGH_SURROGATE)) {
                c = codePointAt(firstLower);
                srcCount = Character.charCount(c);
            } else {
                srcCount = 1;
            }
            int upperCaseChar = Character.toUpperCaseEx(c);
            if ((upperCaseChar == Character.ERROR)
                    || (c != upperCaseChar)) {
                break scan;
            }
            firstLower += srcCount;
        }
        return this;
    }
/*现在检查是否有任何字符需要更改*/
扫描:{
对于(firstLower=0;firstLower=Character.MIN\u HIGH\u代理)

&& (c在toUpperCase方法之后,s1不应该成为一个新字符串吗?为什么你这么认为?@SotiriosDelimanolis因为toUpperCase方法返回一个新字符串,这就是为什么我向你展示了字符串类方法toUpperCase的代码,为什么你认为它会这样做?@SotiriosDelimanolis我认为它创建了一个新对象,该对象引用了包含链接帖子中所述的字符串
的上限值:
toLowerCase()
会识别它,并返回原始字符串。同样的逻辑适用于
toUpperCase
,如果没有进行更改,它会返回相同的字符串。这没有明确说明,所以不要依赖它。这是另一个想法,我的问题是,既然s1和s2现在引用不同的内存,为什么结果是真的y位置。你给了我关于另一个问题的示例。哦,上帝,我没有看到
break scan
语句。这就是原因。如果所有字符都已处于大写模式,代码将不会继续,方法将返回此值。(投票)
        /* Now check if there are any characters that need to be changed. */
    scan: {
        for (firstLower = 0 ; firstLower < len; ) {
            int c = (int)value[firstLower];
            int srcCount;
            if ((c >= Character.MIN_HIGH_SURROGATE)
                    && (c <= Character.MAX_HIGH_SURROGATE)) {
                c = codePointAt(firstLower);
                srcCount = Character.charCount(c);
            } else {
                srcCount = 1;
            }
            int upperCaseChar = Character.toUpperCaseEx(c);
            if ((upperCaseChar == Character.ERROR)
                    || (c != upperCaseChar)) {
                break scan;
            }
            firstLower += srcCount;
        }
        return this;
    }