java函式陣列引數的複製問題

lt發表於2016-11-05

多執行緒解n王后問題的優化 一文中,引用的原作者程式碼有如下一行,

short[] chessTemp=chess.clone();

但是,我們知道陣列在c語言裡就是地址,是可以用來寫陣列內容的,這裡為什麼要clone呢?難道java的陣列引數的表現不同?
我把相關程式碼改寫為不利用clone,儲存為EightQueen9.java,執行結果不變,並且速度翻倍了。

D:\>java EightQueen9
解決 9皇后問題,用時:140毫秒,計算結果:352
解決 10皇后問題,用時:16毫秒,計算結果:724
解決 11皇后問題,用時:15毫秒,計算結果:2680
解決 12皇后問題,用時:63毫秒,計算結果:14200
解決 13皇后問題,用時:296毫秒,計算結果:73712
解決 14皇后問題,用時:1544毫秒,計算結果:365596
解決 15皇后問題,用時:8705毫秒,計算結果:2279184

D:\>javac EightQueen8.java

D:\>java EightQueen8
解決 9皇后問題,用時:47毫秒,計算結果:352
解決 10皇后問題,用時:0毫秒,計算結果:724
解決 11皇后問題,用時:31毫秒,計算結果:2680
解決 12皇后問題,用時:125毫秒,計算結果:14200
解決 13皇后問題,用時:484毫秒,計算結果:73712
解決 14皇后問題,用時:2605毫秒,計算結果:365596
解決 15皇后問題,用時:18065毫秒,計算結果:2279184

同時發現一件有趣的事,如果2個java檔案裡有同名的實現類,比如EightQueen8.java和EightQueen9.java都有一個class EightQueenThread implements Callable,那麼後編譯的類會產生一個新的EightQueenThread.class,但先編譯的主class仍能呼叫它。比如,上面重新編譯了EightQueen8.java,此時執行EightQueen9的時間就和8一樣了,因為2個檔案的主類只有名字不同。

D:\>java EightQueen9
解決 9皇后問題,用時:0毫秒,計算結果:352
解決 10皇后問題,用時:15毫秒,計算結果:724
解決 11皇后問題,用時:31毫秒,計算結果:2680
解決 12皇后問題,用時:110毫秒,計算結果:14200
解決 13皇后問題,用時:483毫秒,計算結果:73712
解決 14皇后問題,用時:2590毫秒,計算結果:365596
解決 15皇后問題,用時:17363毫秒,計算結果:2279184

相關文章