在多线程解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