繁体   English   中英

Java字符串构造函数优化

[英]Java String Constructor Optimization

说我有一个方法:

public String getString() {
    char[] array = new char[]{'a', 'b', 'c'};
    return new String(array);
}

数组是否仍然在String构造函数中复制,或者Java编译器是否足够智能,以识别数组中的元素不能更改,因此它只能引用数组?

谢谢

由于java String类是不可变的,因此构造函数必须复制该数组。

否则,有人可以持有对数组的引用并进行修改:

char[] array = new char[]{'a', 'b', 'c'};
String string = new String(array);

array[1] = 'd'; // array modification must NOT affect the string

查看java.lang.String的源代码:

/**
 * Allocates a new {@code String} so that it represents the sequence of
 * characters currently contained in the character array argument. The
 * contents of the character array are copied; subsequent modification of
 * the character array does not affect the newly created string.
 *
 * @param  value
 *         The initial value of the string
 */
public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

编辑

另请参阅调用System.arraycopyjava.util.Arrays的源代码。

答案应该是显而易见的:要使String保持不变,它必须防御性地复制数组。

考虑以下代码:

public String getString() {
    char[] array = new char[]{'a', 'b', 'c'};
    String s = new String(array); // abc
    array[0] = 'x';
    return s; // xbc 
}

如果复制数组,则支持数组将泄漏,从而使String暴露于可变性。

看看这个构造函数:

  153     public String(String original) {
  154         this.value = original`.value;
  155         this.hash = original.hash;
  156     }

这将是一个字符串文字:

"abc"

这只是对String(char[] value)的调用,其中a,b,c作为char数组的元素传入。 简而言之, String x = "abc"只是语法糖,编译器为您提供了解决上述操作的方法。

如果您看到源代码,您将得到答案。 输入数组被复制而不被引用。 这是源代码:

public String(char value[]) {
this.offset = 0;
this.count = value.length;
this.value = StringValue.from(value);
}

static char[] from(char[] value) {
    return Arrays.copyOf(value, value.length);
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM