Java 数组中System.arraycopy()方法和System类中相关的其他方法的使用详解

简介: Java 数组中System.arraycopy()方法和System类中相关的其他方法的使用详解

方法介绍:

从指定的源数组中复制一个数组,从指定位置开始,到目标数组的指定位置。

@FastNative
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

这个方法的五个参数,具体所表示的含义如下:

  1. src:源数组,就是要复制的数组。
  2. srcPos:源数组中的起始位置,就是要复制数组中具体的片段,全部复制自然是从零开始
  3. dest:目标数组,要把源数组具体复制到哪个数组中。
  4. destPos:目标数据中的起始位置,把源数组复制到目标数据中的位置。
  5. length:要复制的数组元素的数量,如果全部要复制就是源数组arr.length

合并数组就用到了这个方法,大家可以体会一下:

//合并数组
    public static byte[] byteMerger(byte[] bt1, byte[] bt2) {
        byte[] bt3 = new byte[bt1.length + bt2.length];
        System.arraycopy(bt1, 0, bt3, 0, bt1.length);
        System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);
        return bt3;
    }

具体实例,加深理解

public static void main(String[] args) {
    int[] array1 = {1, 2, 3, 4, 5};
        int[] array2 = {5, 6, 7, 8, 9};
        //把array2数组复制到array1中
        System.arraycopy(array2, 0, array1, 1, 4);
        System.out.println(Arrays.toString(array1));
}

输出结果:

System类中其他的常见方法如下

public class System_ {
    public static void main(String[] args) {
        //exit 退出当前程序
//        System.out.println("ok1");
//        //1.exit(0) 表示程序退出
//        //2.0表示一个状态,正常的状态
//        System.exit(0);
//        System.out.println("ok2");
        int[] src = {1, 2, 3};
        int[] dest = new int[3];
        //1.主要搞清楚这五个参数的含义
        //  src:源数组
        //  * @param      src      the source array.
        //      srcPos:从源数组的哪个索引位置开始拷贝
        //     * @param      srcPos   starting position in the source array.
        //    dest:目标数组,即把源数组的数据拷贝到哪个数组
        //     * @param      dest     the destination array.
        //    destPos:把源数组的数据拷贝到 目标数组的哪个索引
        //     * @param      destPos  starting position in the destination data.
        //  length:从源数组拷贝多少个数据到目标数组
        //     * @param      length   the number of array elements to be copied.
//        System.arraycopy(src, 0, dest, 0, 3); //对应输出的结果为:[1,2,3]
//        System.arraycopy(src, 0, dest, 1, 2); //对应输出的结果为:[0,1,2]
//        System.arraycopy(src, 1, dest, 1, 2); //对应输出的结果为:[0,2,3]
//        System.arraycopy(src, 0, dest, 0, src.length - 1); //对应输出的结果为:[1,2,0]
        System.arraycopy(src, 1, dest, 1, src.length - 1);
        System.out.println(Arrays.toString(dest));
        //currentTimeMillis :返回当前时间距离1970-1-1的毫秒数
        System.out.println(System.currentTimeMillis());
    }
}

输出结果

[0, 2, 3]
1651201130840

System.gc方法和finalize方法的配合使用如下

测试的代码如下

public class Finalize_ {
    public static void main(String[] args) {
        Car bmw = new Car("宝马");
        //这时 car对象就是一个垃圾,垃圾回收器就会回收(销毁)对象,在销毁对象前,会调用该对象的finalize()方法
        //程序员就可以在finalize中,写自己的业务逻辑代码(比如释放资源,数据库连接,或者打开文件..)
        //如果程序员不重写finalize,那么就会调用Object类的finalize,即默认处理
        //如果程序员重写了finalize,就可以实现自己的逻辑
        bmw = null;
        System.gc();//主动调用垃圾回收器
        System.out.println("程序退出...");
    }
}
class Car {
    private String name;
    public Car(String name) {
        this.name = name;
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("我们销毁 汽车" + name);
        System.out.println("释放了某些资源");
    }
}

输出结果如下

我们销毁 汽车宝马
释放了某些资源
程序退出...

有不当之处,可以在评论区指出,共同进步~


目录
相关文章
|
4天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
31 17
|
2天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
2天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
2天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
11 3
|
5天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
16 5
|
5天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
11 3
|
5天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
9 2
|
5天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
17 2
|
5天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
15 2
|
5天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
8 1