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() 方法啥时候创建一个新对象?的主要内容,如果未能解决你的问题,请参考以下文章
通过重写 Java 的 String.toUpperCase() 返回空字符数组 [重复]
java用String类的toUpperCase()和toLowerCase()方法转字符串的大小写