【问题标题】: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) 方法有何影响

标签: java string object


【解决方案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 这不应该适用于不可变对象,字符串是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2017-09-23
  • 2011-01-11
  • 2017-11-15
  • 2021-08-16
相关资源
最近更新 更多