Java Array类和实现System.arraycopy()数组拷贝

1、Array类与Arrays类?

      Array类提供提供静态方法来动态创建和访问 Java数组的方法。

      Arrays类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。

2、Array类的方法

    • static Object get(Object array, int index)

      返回指定数组对象中的索引组件的值。

      static void set(Object array, int index, Object value)

      将指定数组对象的索引组件的值设置为指定的新值。

      static Object newInstance(<?> componentType, int... dimensions)

      创建具有指定组件类型和尺寸的新数组。

      static Object newInstance(<?> componentType, int length)

      创建具有指定组件类型和长度的新数组。

      static boolean getBoolean(Object array, int index)

      返回指定数组对象中的索引组件的值,如 boolean

           getXXX八大基本类型

      static void setBoolean(Object array, int index, boolean z)

      将指定数组对象的索引组件的值设置为指定的 boolean值。

           setXXX八大基本类型

             数组是引用数据类型,数组其实是对象。所以可以在 Array类中吧数组作为对象处理数组中的元素。

            

3、通过 反射和 Array类中的方法实现 System.arraycopy() 数组拷贝

      

       

实现Demo

public class ArrayDemo {
    public static void main(String[] args) {
        int[] src = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int[] dest = new int[10];
        System.out.println(Arrays.toString(dest)); //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        arraycopy(src, 4, dest, 3, 5);
        System.out.println(Arrays.toString(dest)); //[0, 0, 0, 5, 6, 7, 8, 9, 0, 0]
    }

    /**
     *  实现 System类中,数组拷贝的arraycopy方法
     * @param src - 源数组
     * @param srcPos - 源数组中的起始位置。
     * @param dest - 目标数组。
     * @param destPos - 目的地数据中的起始位置。
     * @param length - 要复制的数组元素的数量。
     */
    public static void arraycopy(Object src, int srcPos, Object dest,int destPos, int length) {
        if (src == null || dest == null) {
            throw new NullPointerException("源数组和目标数组不能为空");
        }
        if (!src.getClass().isArray() || !dest.getClass().isArray()) {
            throw new ArrayStoreException("源和目标必须都是数组");
        }
        if (srcPos < 0 || destPos < 0 || srcPos + length > Array.getLength(src)
                || destPos + length > Array.getLength(dest)) {
            throw new IndexOutOfBoundsException("索引越界");
        }
        if (src.getClass().getComponentType() != dest.getClass()
                .getComponentType()) {
            throw new ArrayStoreException("源数组和目标数组类型要一致");
        }
        for (int index = srcPos ; index<srcPos+length; index++ ) {
            //获取需要拷贝的元素
            Object val = Array.get(src, index);
            //给目标数组设置元素
            Array.set(dest, destPos, val);
            destPos++;
        }
    }
}

ends

发布了248 篇原创文章 · 获赞 59 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42402854/article/details/99704272