JavaAPI——System的基本使用

30 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

常用System

方法名说明
public static void exit(int status)终止当前运行的Java虚拟机
public static long currentTimeMillis()返回当前系统的时间毫秒值形式
public static void arraycopy
(数据源数组,起始索引,目的地数组,起始索引,拷贝个数)
数组拷贝

计算机时间中的原点

原点:1970年1月1日 00:00:00 起因:1969年8月,贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会。开始着手创造一个全新的革命性的操作系统 他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。 随后,汤普逊和同事丹尼斯里奇改进了B语言,开发出了C语言,重写了UNIX 所以,1970年1月1日算是C语言的生日

exit退出

  • 方法的形参
  • 0:表示当前虚拟机是正常停止
  • 非0:表示当前虚拟机异常停止
public static void main(String[] args) {  
    System.exit(0);  
    System.out.println("我在运行吗?");  
}

image.png

currentTimeMillis

这表示从1970.1.1开始到现在的毫秒数

long l = System.currentTimeMillis();  
System.out.println(l);

image.png 这可以用来比较解决同一问题不同算法的效率问题 以判断素数为例子

package SystemTest;  
  
public class SystemDome02 {  
    //统计0~10000有多少个素数  
    public static void main(String[] args) {  
        long lowTimeStart = System.currentTimeMillis();  
        System.out.println("用较差的方法做出来的个数是:" + lowIntPrime());  
        long lowTimeEnd = System.currentTimeMillis();  
        System.out.println("差方法耗时:" + (lowTimeEnd - lowTimeStart) + "毫秒");  
  
        long betterTimeStart = System.currentTimeMillis();  
        System.out.println("用较好的方法做出来的个数是:" + betterIntPrime());  
        long betterTimeEnd = System.currentTimeMillis();  
        System.out.println("较好的方法耗时:" + (betterTimeEnd - betterTimeStart) + "毫秒");  
    }  
  
    //最朴素的做法  
    public static int lowIntPrime() {  
        int res = 0;  
        for (int i = 0; i < 10000; i++) if (lowIntPrimeFunction(i)) res++;  
        return res;  
    }  
  
    public static boolean lowIntPrimeFunction(int x) {  
        if (x < 2) return false;  
        for (int i = 2; i < x; i++) if (x % i == 0) return false;  
        return true;    }  
  
    //根号n的复杂度  
    public static int betterIntPrime() {  
        int res = 0;  
        for (int i = 0; i < 10000; i++) if (betterIntPrimeFunction(i)) res++;  
        return res;  
    }  
  
    public static boolean betterIntPrimeFunction(int x) {  
        if (x < 2) return false;  
        for (int i = 2; i <= x / i; i++) if (x % i == 0) return false;  
        return true;    }  
}

结果展示

image.png 我们可以看到,时间差十倍!同时看代码大家也可以理解时间差以及如何计算耗时

拷贝数组

//拷贝数组  
int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  
int[] arr2 = new int[10];  
System.arraycopy(arr1, 0, arr2, 0, 10);  
  
//测试:  
for (int i = 0; i < arr2.length; i++) {  
    System.out.print(arr2[i] + " ");  
}
  • 参数解释
  • 参数一:数据源 要拷贝的数据从哪个数组而来
  • 参数二:从数据源数组中的第几个索引开始拷贝
  • 参数三:目的地 我要把数据拷贝到哪个数组中
  • 参数四:目的地数组的索引
  • 参数五:拷贝的个数

注意点

  • 如果数据源数组和目的地数组都是基本数据类型,那么两者的类型必须保持一致,否则会报错
  • 在拷贝的时候需要考虑数组的长度,如果超出范围也会报错
  • 如果数据源数组和目的地数组都是引用数据类型,那么子类型可以赋值给父类类型