違いを確認するための簡単なプログラムを作成しました。
public static void main(String[] args) throws IOException, InterruptedException,
PrinterException
{
//Verify array remains immutable.
String[] str = {"a","b","c"};
String[] strings = str.clone();
//change returned array
strings[2]= "d";
System.out.println(Arrays.toString(str));
System.out.println(Arrays.toString(strings));
String[] stringsCopy = Arrays.copyOf(str, str.length);
stringsCopy[2]= "d";
System.out.println(Arrays.toString(str));
System.out.println(Arrays.toString(stringsCopy));
//peformance
long before = System.currentTimeMillis();
for(int i=0;i<Integer.MAX_VALUE;i++)
{
str.clone();
}
System.out.println("Time Required for Clone: "+ (System.currentTimeMillis()-before));
//peformance
long beforeCopy = System.currentTimeMillis();
for(int i=0;i<Integer.MAX_VALUE;i++)
{
Arrays.copyOf(str, str.length);
}
System.out.println("Time Required for Copy of: "+ (System.currentTimeMillis()-beforeCopy));
}
そしてそれは出力します
[a, b, c]
[a, b, d]
[a, b, c]
[a, b, d]
Time Required for Clone: 26288
Time Required for Copy of: 25413
したがって、どちらの場合String[]
も不変であり、パフォーマンスはほぼ同じだと思われる場合は、Arrays.copyOf()の方が私のマシンではわずかに高速です。
アップデート
プログラムを変更して、小さな配列ではなく大きな配列[100文字列]を作成しました。
String[] str = new String[100];
for(int i= 0; i<str.length;i++)
{
str[i]= Integer.toString(i);
}
そして、メソッドのcopy of
前にclone
メソッドを移動しました。以下の結果で。
Time Required for Copy of: 415095
Time Required for Clone: 428501
これもまた同じです。Please do not ask me to run the test again as it takes a while
:(
アップデート2
文字列配列1000000
および反復回数の場合10000
Time Required for Copy of: 32825
Time Required for Clone: 30138
copy of
より時間がかかりますclone