Java二维数组遍历性能讨论

2D-array

谈到编程,想必对于数组和数组的遍历都不会陌生。谈到二维数组的遍历,但是在性能方面不同的遍历方法的性能有着很大的不同这篇文章将会讨论Java中遍历二维数组的性能问题。

说起一维数组的遍历大家都应该很熟悉,写一个for循环,从数组下标0到最后一个下标依次输出就可以了。就像下面的代码一样。

<pre>public class arr {

    public static void main(String[] args){

        int arr[]={0,1,2,3,4};
        goThroughArr(arr);

    }

    
    public static void goThroughArr(int[] arr)
    {
        for (int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }
}</pre>

输出结果

0
1
2
3
4

Process finished with exit code 0

对于二维数组的遍历,无非就是使用双重for循环,有两种方法,第一种是先行,另一种是先遍历列,尽管只是小小的差异,但是运行时间却有着很大的不同。

下面的代码分别用两种遍历方法来遍历二维数组并且输出时间。

<pre>public class twoDarray {

    private static final int arrSize=9999;

    public static void main(String[] args){

        //建立二维数组
        int arr[][]=new int[arrSize][arrSize];
        long currTime=System.currentTimeMillis();
        //通过列遍历
        byCol(arr);
        System.out.println("通过列遍历总时间 : " + (System.currentTimeMillis() - currTime) + " ms");

        currTime=System.currentTimeMillis();
        //通过行遍历通过
        byRow(arr);
        System.out.println("通过行遍历总时间: " + (System.currentTimeMillis() - currTime) + " ms");

    }

    //通过列遍历
    public static void byCol(int[][] arr)
    {
        for (int i=0;i<arrSize;i++){
            for (int j=0;j<arrSize;j++){
                arr[i][j]=i+j;
            }
        }
    }

    //通过行遍历
    public static void byRow(int[][] arr)
    {
        for (int i=0;i<arrSize;i++){
            for (int j=0;j<arrSize;j++){
                arr[j][i]=i+j;
            }
        }
    }
}</pre>

输出结果:

通过列遍历总时间 : 115 ms
通过行遍历总时间: 3142 ms

分析代码,通过列遍历和通过行遍历只是调换了下 i 和 j 的位置,但是遍历完成用的时间却千差万别。

原因就是Java的二维数组其实是使用一维数组来实现的,通过建立一个一维数组,一维数组的每一个位置又储存了一个数组才形成了二维数组。下面这张图可以很好地解释:

2darray

 

由于不同数组之间的储存位置在内存中不是连续的,所以这就导致了通过行遍历二维数组的时候总是要在不同的一维数组数组之间来回切换,而且在非连续内存的读取速度肯定是赶不上连续内存的,这就造成了两种方法的性能差异。

打赏

Leave a Reply

Your email address will not be published. Required fields are marked *