Java 基础教程

数组拷贝

数组拷贝指将一个数组中连续多个元素或者所有元素的值批量拷贝到另一个数组中。实现数组拷贝的方式有很多种,下面介绍几种常用方式。

for 循环

我们可以通过自己手动编写循环语句(for、while、do-while)实现数组的拷贝。

示例代码如下:

import java.util.Arrays;

public class Demo {

    public static void main(String[] args) {
        // 初始化数组
        String[] source = {
                "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"
        };
        String[] target = new String[3];

        // 从 source 数组中下标 3 开始复制 3 个元素到 target 数组
        for(int i = 0; i < target.length; i++) {
            int index = i + 3;
            if(index < source.length) {
                target[i] = source[i + 3];
            }
        }

        // 打印 target 数组到控制台
        System.out.println(Arrays.toString(target));
    }

}

运行示例,输出如下:

[星期四, 星期五, 星期六]

System.arraycopy()

利用 System 类提供的 arraycopy() 方法实现数组拷贝。方法声明如下:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

参数说明:

  • src - 源数组。

  • srcPos - 源数组中的起始位置。

  • dest - 目标数组。

  • destPos - 目标数据中的起始位置。

  • length - 要复制的数组元素的数量。

示例代码:

import java.util.Arrays;

public class Demo {

    public static void main(String[] args) {
        // 初始化数组
        String[] source = {
                "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"
        };
        String[] target = new String[3];

        // 从 source 数组中下标 3 开始复制 3 个元素到 target 数组
        System.arraycopy(source, 3, target, 0, target.length);

        // 打印 target 数组到控制台
        System.out.println(Arrays.toString(target));
    }

}

运行示例,输出如下:

[星期四, 星期五, 星期六]

Arrays.copyOf()

使用 java.utils.Arrays 工具的 copyOf() 方法从目标数组中复制指定个元素,返回一个新的数组。方法声明如下:

public static boolean[] copyOf(boolean[] original, int newLength)
public static byte[] copyOf(byte[] original, int newLength)
public static char[] copyOf(char[] original, int newLength)
public static double[] copyOf(double[] original, int newLength)
public static float[] copyOf(float[] original, int newLength)
public static int[] copyOf(int[] original, int newLength)
public static long[] copyOf(long[] original, int newLength)
public static short[]	copyOf(short[] original, int newLength)
public static<T> T[] copyOf(T[] original, int newLength)
public static<T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType)

参数说明:

  • original - 要复制的数组

  • newLength - 要返回的副本的长度

示例代码:

import java.util.Arrays;

public class Demo {

    public static void main(String[] args) {
        // 初始化数组
        String[] source = {
                "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"
        };

        // 复制 source 数组的前3个元素
        String[] target = Arrays.copyOf(source, 3);

        // 打印 target 数组到控制台
        System.out.println(Arrays.toString(target));
    }

}

运行示例,输出如下:

[星期一, 星期二, 星期三]

Arrays.copyOfRange()

使用 java.utils.Arrays 工具类的 copyOfRange() 方法将指定数组的指定范围复制到一个新数组。方法定义如下:

public static boolean[] copyOfRange(boolean[] original, int from, int to)
public static byte[] copyOfRange(byte[] original, int from, int to)
public static char[] copyOfRange(char[] original, int from, int to)
public static double[] copyOfRange(double[] original, int from, int to)
public static float[] copyOfRange(float[] original, int from, int to)
public static int[] copyOfRange(int[] original, int from, int to)
public static long[] copyOfRange(long[] original, int from, int to)
public static short[] copyOfRange(short[] original, int from, int to)
public static <T> T[] copyOfRange(T[] original, int from, int to)
public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType)

参数说明:

  • original - 将要从其复制一个范围的数组

  • from - 要复制的范围的初始索引(包括)

  • to - 要复制的范围的最后索引(不包括)。(此索引可能位于数组范围之外)。

示例代码:

import java.util.Arrays;

public class Demo {

    public static void main(String[] args) {
        // 初始化数组
        String[] source = {
                "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"
        };

        // 从 source 数组中下标 3 开始复制 3 个元素到 target 数组
        String[] target = Arrays.copyOfRange(source, 3, 6);

        // 打印 target 数组到控制台
        System.out.println(Arrays.toString(target));
    }

}

运行示例,输出如下:

[星期一, 星期二, 星期三]

注意:上面介绍了几种拷贝数组的方法,但是这些方式均对数组进行“浅拷贝”。如果我们在数组中存储的是引用类型,那么数组每个元素实际存储的是引用类型对象在堆中的内存地址。当我将数组 a 的 a[i] 元素拷贝给数组 b 的 b[i] 元素,此时 a[i] 和 b[i] 指向同一个对象,当通过 b[i] 修改对象信息后,a[i] 指向的对象也会被修改。例如:

import java.util.Arrays;

public class Demo {

    class User {
        private String name;

        public User(String name) {
            this.name = name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return "User{" + "name='" + name + '\'' + '}';
        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        // 初始化数组
        User[] source = {
                // 实例化内部内,后续章节会介绍相关知识
                demo.new User("Tom"),
                demo.new User("Helen"),
                demo.new User("Bill"),
        };
        User[] target = Arrays.copyOf(source, 2);

        // 修改 target 数组
        for(User user : target) {
            user.setName(user.getName() + "-update");
        }

        // 打印 target 数组到控制台
        System.out.println(Arrays.toString(source));
        System.out.println(Arrays.toString(target));
    }

}

运行示例,输出如下:

[User{name='Tom-update'}, User{name='Helen-update'}, User{name='Bill'}]
[User{name='Tom-update'}, User{name='Helen-update'}]
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号