1. 程式人生 > >陣列擴容的那點事

陣列擴容的那點事

1、最近對陣列擴容有點感興趣,發現技術真是個好東西,當你深入瞭解的時候,你會發現許多有趣的事。比如陣列的功能就是,在實際專案開發中,我們使用陣列的頻率是非常高的。因此,正確使用陣列,會使用陣列功能是非常有必要的。來讓我們瞭解一下陣列的功能特徵:

Java陣列擴容的原理

  1)、Java陣列物件的大小是固定不變的,陣列物件是不可擴容的。

  2)、System.arraycopy()能夠對陣列進行擴容。

  3)、Arrays.copyOf()能夠簡便的建立副本的同時能擴容也能縮容。

  4)、建立陣列副本的同一時候將陣列長度新增就變通的實現了陣列的擴容。

       /**
         * 2、陣列擴容
         */

        //定義一個整型陣列
        int[] array = {10,20,30,40,50};
        array = Arrays.copyOf(array,4);
        System.out.println("copyOf方法縮容:" + Arrays.toString(array));

        array = Arrays.copyOf(array,5);
        System.out.println("copyOf擴容:" + Arrays.toString(array));

(1)那讓我看一下Arrays.copyOf()的原始碼,你會發現特別神奇之處

     *
     * @param original the array to be copied
     * @param newLength the length of the copy to be returned
     * @return a copy of the original array, truncated or padded with zeros
     *     to obtain the specified length
     * @throws NegativeArraySizeException if <tt>newLength</tt> is negative
     * @throws NullPointerException if <tt>original</tt> is null
     * @since 1.6
     */
    public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

是的,Array.copyOf()方法裡面使用了System.arraycopy()方法,並且方法裡面最後一個使用到Math.min(a,b)方法,這個方法目的是為了取a,b之間最小的那個數;當複製的元素的個數大於目標元素時,會有ArrayIndexOutOfBoundsException異常,即陣列下標越界異常:

(2)我們隨便寫一個System.arraycopy()的方法,程式碼如下:

       int[] newArr =arrayCopy(array,10);
        System.out.println("陣列擴容arraycopy:" + Arrays.toString(newArr));

    }

    private static int[] arrayCopy(int[] orignal, int length) {

        int[] newArr = new int[length];
        System.arraycopy(orignal,0,newArr,0,Math.min(orignal.length,length));
        return newArr;

    }

我們也需要在System.arraycopy()方法的最後一個引數增加Math.min(a,b)方法,目的如上已經說明,這樣一個數組的擴容就可以很好實現了。

(3)我們再來說一個數組範圍擷取元素的方法--Arrays.copyOfRange(a,from,to),a代表需要擷取的陣列,from表示從陣列第幾個元素開始(包括此from),to表示截至到幾個元素(不包括此to),上程式碼:

        array = Arrays.copyOfRange(array,2,8);
        System.out.println("擷取範圍copyOfRange方法:" + Arrays.toString(array));
  *
     * @param original the array from which a range is to be copied
     * @param from the initial index of the range to be copied, inclusive
     * @param to the final index of the range to be copied, exclusive.
     *     (This index may lie outside the array.)
     * @return a new array containing the specified range from the original array,
     *     truncated or padded with zeros to obtain the required length
     * @throws ArrayIndexOutOfBoundsException if {@code from < 0}
     *     or {@code from > original.length}
     * @throws IllegalArgumentException if <tt>from &gt; to</tt>
     * @throws NullPointerException if <tt>original</tt> is null
     * @since 1.6
     */
    public static int[] copyOfRange(int[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        int[] copy = new int[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

上面的比較簡單一些,也很容易掌握。

作為一個合格的程式設計師,一定要學會看原始碼,更重要的是堅持看原始碼,養成一個好的習慣,從他們的經驗中能學到許多珍貴的程式理念。筆者最近在看mybatis的原始碼,受益匪淺,假以時日也一併奉上。

如果,你們感覺我寫的還可以,請一定要給個贊,你們的讚揚是我最大的動力;當然,如果感覺寫的差強人意,請不吝賜教。