hi string有下面代码,
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
为什么不能用copyof呢,后面写的是初始化次序问题
可是 copyof的实现跟上面几乎一样...
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
为什么不能用copyof呢,后面写的是初始化次序问题
可是 copyof的实现跟上面几乎一样...
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
但是你的目标数组长度跟源数组长度不一样,
toCharArray这个方法源数组跟目标数组长度一样。
所以你copyof会出现丢失字符以及字符变多的情况。
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = Arrays.copyOf(arr1, 10);for(int i = 0; i < arr2.length; i++)
System.out.print(arr2[i] + " ");
System.out.println();
}
}
执行结果:1 2 3 4 5 0 0 0 0 0
一个是原封不动的char数组
另外一个是复制指定长度的,如果所指定的长度大于源字符串的长度,补足的部分是char的默认值0,;如果指定长度小于源字符串的长度,就是按指定长度截取了
try {
r = new FileReader("blah");
} catch (IOException e) {
e.printStackTrace();
}
r.read(.....);
try {
r = new FileReader("blah");
} catch (IOException e) {
e.printStackTrace();
}
r.read(.....);
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
上面是string.java里面的代码.但是我如果改成下面的
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
return Arrays.copyof(value,value.length);
}
是否可以?看注释好像是不行的
虽然String 和Arrays 都属性rt.jar中的类,但是BootstrapClassloader 在加载这两个类的顺序是不同的。
所以当String.class被加载进内存的时候,Arrays此时没有被加载,所以直接使用肯定会抛异常。而System.arrayCopy是使用native代码,则不会有这个问题。
另外你说的把代码换掉以后也能运行, 这时候 jvm已经加载完了所有的系统类, 所以你才会看到也能正常运行。建议楼主去了解一下jvm 类加载器方面的知识 就明白了