toUpperCase()方法什么时候会创建一个新对象?

12
public class Child{

    public static void main(String[] args){
        String x = new String("ABC");
        String y = x.toUpperCase();

        System.out.println(x == y);
    }
}

输出:true

toUpperCase() 是否总是创建一个新对象?


2
我不会依赖这种行为,但我希望它能避免创建新对象。 - Peter Lawrey
注意:new String(...)不会改变答案。 - Peter Lawrey
8
请不要这样做。您会创建两个String对象。只需使用x = "ABC"即可。 - Andrii Plotnikov
编辑:有人指出OP使用new String(“ABC”)来指出它没有被编入。我不明白是否编入或未编入对toUpperCase(Locale)方法有何影响。 - Andrii Plotnikov
1个回答

18

toUpperCase()方法调用toUpperCase(Locale.getDefault()),只有在必要时才会创建一个新的String对象。如果输入的String已经是大写字母,它将返回输入的String

但是这似乎是一些具体实现的细节,我没有在Javadoc文档中找到相关提及。

下面是一个实现示例:

public String toUpperCase(Locale locale) {
    if (locale == null) {
        throw new NullPointerException();
    }

    int firstLower;
    final int len = value.length;

    /* 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; // <-- the original String is returned
    }
    ....
}

4
如果它创建了一个新的对象(并返回该新对象),那么 x == y 肯定会返回 false。 - Eran
2
@Sarief 它不知怎么地进入了这个列表,这往往会导致高流量。 - Eran
1
@Eran 让我重新表述一下,即使在合同中规定它创建一个新对象并且它确实创建了一个新对象,也不意味着它会返回一个新对象。字符串包含在字符串池中,并且大多数情况下会从那里重用。 - Andrii Plotnikov
1
@Sarief 首先,这不是一个愚蠢的问题,因为字符串是不可变的,所以任何操作都应该产生一个单独的对象。其次,答案与许多人想象的相同字符串池中的相同字符串有关,但实际上并非如此,因为 OP 使用 new 创建了字符串,而没有调用 intern(),因此正确地指出了实现方式是为什么在问题中提出的情况下没有创建新对象的原因。 - nits.kk
2
@nits.kk 这不适用于不可变对象,例如字符串。 - Andrii Plotnikov
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接