toUpperCase() 方法啥时候创建一个新对象?

Posted

技术标签:

【中文标题】toUpperCase() 方法啥时候创建一个新对象?【英文标题】:When does the toUpperCase() method create a new object?toUpperCase() 方法什么时候创建一个新对象? 【发布时间】:2019-04-21 13:13:48 【问题描述】:
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() 总是创建一个新对象吗?

【问题讨论】:

我不会依赖这种行为,但我希望它能够避免创建新对象。 注意:new String(...) 不会改变答案。 String x = new String("ABC");请不要这样做。您创建 String 对象两次。只需使用 x = "ABC"; edit:有人指出 OP 使用 new String("ABC") 来指出它没有被实习。我看不出实习或不实习对 toUpperCase(Locale) 方法有何影响 【参考方案1】:

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
    
    ....

【讨论】:

@Sarief 如果它创建了一个新对象(并返回了那个新对象)x == y 肯定会返回 false。 @Sarief 它以某种方式到达了this list,这往往会导致高流量。 @Eran 让我换个说法,即使它在合同中创建了一个新对象并且确实创建了一个新对象,但这并不意味着它将返回一个新对象。字符串包含在字符串池中,主要从那里重复使用 @Sarief 首先,这不是一个愚蠢的问题,因为字符串是不可变的,因此执行的任何操作都将产生一个单独的对象。其次,许多人认为的答案与字符串池中的相同字符串有关,但它不是因为 OP 使用 new 创建了字符串并且没有调用 intern() 因此答案正确地指出了执行结果,因为没有新对象是为问题提出的案例创建 @nits.kk 这不应该适用于不可变对象,字符串是

以上是关于toUpperCase() 方法啥时候创建一个新对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dart 中向 Map 添加新对?

通过重写 Java 的 String.toUpperCase() 返回空字符数组 [重复]

spring啥时候使用不同的请求方法

java用String类的toUpperCase()和toLowerCase()方法转字符串的大小写

java中啥时候该用static修饰方法?有啥好处或者坏处?

第5条:避免创建不必要的对象