使用System.arraycopy()实现数组之间的复制

来源:互联网 发布:json如何取数组 编辑:程序博客网 时间:2024/06/11 13:47


System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。

其函数原型是: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。

<span style="font-size:18px;">/**     * Copies an array from the specified source array, beginning at the     * specified position, to the specified position of the destination array.     * A subsequence of array components are copied from the source     * array referenced by <code>src</code> to the destination array     * referenced by <code>dest</code>. The number of components copied is     * equal to the <code>length</code> argument. The components at     * positions <code>srcPos</code> through     * <code>srcPos+length-1</code> in the source array are copied into     * positions <code>destPos</code> through     * <code>destPos+length-1</code>, respectively, of the destination     * array.     * <p>     * If the <code>src</code> and <code>dest</code> arguments refer to the     * same array object, then the copying is performed as if the     * components at positions <code>srcPos</code> through     * <code>srcPos+length-1</code> were first copied to a temporary     * array with <code>length</code> components and then the contents of     * the temporary array were copied into positions     * <code>destPos</code> through <code>destPos+length-1</code> of the     * destination array.     * <p>     * If <code>dest</code> is <code>null</code>, then a     * <code>NullPointerException</code> is thrown.     * <p>     * If <code>src</code> is <code>null</code>, then a     * <code>NullPointerException</code> is thrown and the destination     * array is not modified.     * <p>     * Otherwise, if any of the following is true, an     * <code>ArrayStoreException</code> is thrown and the destination is     * not modified:     * <ul>     * <li>The <code>src</code> argument refers to an object that is not an     *     array.     * <li>The <code>dest</code> argument refers to an object that is not an     *     array.     * <li>The <code>src</code> argument and <code>dest</code> argument refer     *     to arrays whose component types are different primitive types.     * <li>The <code>src</code> argument refers to an array with a primitive     *    component type and the <code>dest</code> argument refers to an array     *     with a reference component type.     * <li>The <code>src</code> argument refers to an array with a reference     *    component type and the <code>dest</code> argument refers to an array     *     with a primitive component type.     * </ul>     * <p>     * Otherwise, if any of the following is true, an     * <code>IndexOutOfBoundsException</code> is     * thrown and the destination is not modified:     * <ul>     * <li>The <code>srcPos</code> argument is negative.     * <li>The <code>destPos</code> argument is negative.     * <li>The <code>length</code> argument is negative.     * <li><code>srcPos+length</code> is greater than     *     <code>src.length</code>, the length of the source array.     * <li><code>destPos+length</code> is greater than     *     <code>dest.length</code>, the length of the destination array.     * </ul>     * <p>     * Otherwise, if any actual component of the source array from     * position <code>srcPos</code> through     * <code>srcPos+length-1</code> cannot be converted to the component     * type of the destination array by assignment conversion, an     * <code>ArrayStoreException</code> is thrown. In this case, let     * <b><i>k</i></b> be the smallest nonnegative integer less than     * length such that <code>src[srcPos+</code><i>k</i><code>]</code>     * cannot be converted to the component type of the destination     * array; when the exception is thrown, source array components from     * positions <code>srcPos</code> through     * <code>srcPos+</code><i>k</i><code>-1</code>     * will already have been copied to destination array positions     * <code>destPos</code> through     * <code>destPos+</code><i>k</I><code>-1</code> and no other     * positions of the destination array will have been modified.     * (Because of the restrictions already itemized, this     * paragraph effectively applies only to the situation where both     * arrays have component types that are reference types.)     *     * @param      src      the source array.     * @param      srcPos   starting position in the source array.     * @param      dest     the destination array.     * @param      destPos  starting position in the destination data.     * @param      length   the number of array elements to be copied.     * @exception  IndexOutOfBoundsException  if copying would cause     *               access of data outside array bounds.     * @exception  ArrayStoreException  if an element in the <code>src</code>     *               array could not be stored into the <code>dest</code> array     *               because of a type mismatch.     * @exception  NullPointerException if either <code>src</code> or     *               <code>dest</code> is <code>null</code>.     */    public static native void arraycopy(Object src,  int  srcPos,                                        Object dest, int destPos,                                        int length);</span>

注意:src and dest都必须是同类型或者可以进行转换类型的数组. 有趣的是这个函数可以实现自己到自己复制。

比如: int[] fun ={0,1,2,3,4,5,6}; System.arraycopy(fun,0,fun,3,3); 则结果为:{0,1,2,0,1,2,6}。

实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos 到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).

转载地址:http://blog.163.com/malloc_wet/blog/static/1104560862011921115853610/

0 0
原创粉丝点击