学科分类
目录
Java基础

System类

System类对于读者来说并不陌生,因为在之前所学知识中,需要打印结果时,使用的都是“System.out.println();”语句,这句代码中就使用了System类。System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,因此,想要引用这些属性和方法,直接使用System类调用即可。

System类的常用方法,如表1所示。

表1 System类的常用方法

方法声明 功能描述
static void exit(int status) 该方法用于终止当前正在运行的Java虚拟机,其中参数status表示状态码,若状态码非0 ,则表示异常终止
static void gc() 运行垃圾回收器,并对垃圾进行回收
static native long currentTimeMillis() 返回以毫秒为单位的当前时间
static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) 从src引用的指定源数组复制到dest引用的数组,复制从指定的位置开始,到目标数组的指定位置结束
static Properties getProperties() 取得当前的系统属性
static String getProperty(String key) 获取指定键描述的系统属性

在表1中,列出了System类的常用方法,接下来通过一些案例针对表中的方法进行逐一讲解。

1.getProperties()方法

System类的getProperties()方法用于获取当前系统的全部属性,该方法会返回一个Properties对象,其中封装了系统的所有属性,这些属性是以键值对形式存在的。接下来通过一个案例来演示getProperties()方法的使用,如文件1所示。

文件1 Example09.java

 1    import java.util.*;
 2    public class Example09 {
 3        public static void main(String[] args) {
 4            // 获取当前系统属性
 5            Properties properties = System.getProperties();
 6            System.out.println(properties);
 7            // 获取所有系统属性的key(属性名),返回Set对象
 8            Set<String> propertyNames = properties.stringPropertyNames();
 9            for (String key : propertyNames ) {
 10                //获取当前键key(属性名)所对应的值(属性值)
 11                String value = System.getProperty(key);
 12                System.out.println(key +"--->"+ value);
 13            }
 14        }
 15    }

运行结果如图1所示。

图1 运行结果

文件1实现了获取当前系统属性的功能。首先通过System的getProperties()方法获取封装了系统属性的Properties集合,然后对Properties集合进行迭代,将所有系统属性的键以及对应的值打印出来。关于集合将在下一章中进行讲解,在这里读者只需知道通过System.getProperties()方法可以获得系统属性即可。从图1中可以看出,这些系统属性包括虚拟机版本号、用户的国家、操作系统的版本等。

2.currentTimeMillis()

currentTimeMillis()方法返回一个long类型的值,该值表示当前时间与1970年1月1日0点0分0秒之间的时间差,单位是毫秒,通常也将该值称作时间戳。为了便于读者理解该方法的使用,接下来通过一个案例来计算程序在进行求和操作时所消耗的时间,如文件2所示。

文件2 Example10.java

 1    public class Example10 {
 2        public static void main(String[] args) {
 3            long startTime = System.currentTimeMillis();// 循环开始时的当前时间
 4            int sum = 0;
 5            for (int i = 0; i < 100000000; i++) {
 6                sum += i;
 7            }
 8            long endTime = System.currentTimeMillis();// 循环结束后的当前时间
 9            System.out.println("程序运行时间为:"+(endTime - startTime)+ "毫秒");
 10        }
 11    }

运行结果如图2所示。

图2 运行结果

文件2中,演示了数字的求和操作,程序在求和开始和结束时,分别调用了currentTimeMillis()方法获得了两个时间戳,两个时间戳之间的差值便是求和操作耗费的时间。需要注意的是,由于处理器性能等原因,程序运行的时间也会有所不同。

3.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

arraycopy()方法用于将一个数组中的元素快速拷贝到另一个数组,其中参数列表中的参数具体说明如下:

● src:表示源数组;

● dest:表示目标数组;

● srcPos:表示源数组中拷贝元素的起始位置;

● destPos:表示拷贝到目标数组的起始位置;

● length:表示拷贝元素的个数。

在进行数组复制时,目标数组必须有足够的空间来存放拷贝的元素,否则会发生角标越界异常。接下来通过一个案例来演示数组元素的拷贝,如文件3所示。

文件3 Example11.java

 1    public class Example11 {
 2        public static void main(String[] args) {
 3            int[] srcArray = { 101, 102, 103, 104, 105, 106 }; // 源数组
 4            int[] destArray = { 201, 202, 203, 204, 205};       // 目标数组
 5            System.arraycopy(srcArray, 2, destArray, 0, 4);    // 拷贝数组元素
 6            // 打印目标数组中的元素
 7            for (int i = 0; i < destArray.length; i++) {
 8                System.out.println(i + ": " + destArray[i]);
 9            }
 10        }
 11    }

运行结果如图3所示。

图3 运行结果

文件3中,创建了两个数组srcArray和destArray,分别代表源数组和目标数组,当调用arraycopy()方法进行元素拷贝时,由于指定了从源数组中索引为2的元素开始拷贝,并且拷贝4个元素存放在目标数组中索引为0的位置,因此,在打印目标数组的元素时,程序首先打印输出的是从源数组srcArray中拷贝的的后四个元素,然后打印输出的destArray中的最后一个元素。

需要注意的是,使用arraycopy()方法进行数组元素拷贝时,一定要保证源数组元素类型和目标数组元素类型一样,否则程序运行会出现ArrayStoreException异常。另外,使用arraycopy()方法时,最后一个复制的元素长度参数length既不能超过截取的源数组从指定位置srcPos开始剩余元素个数,也不能超过目标数组从指定位置destPos开始可容纳的元素个数,否则程序运行会出现ArrayIndexOutOfBoundsException异常。

小提示:

除了以上案例涉及到的方法外,System类还有两个常见的方法,分别是gc()和exit(int status)方法。其中gc()方法用来启动Java的垃圾回收器,并且对内存中的垃圾对象进行回收。exit(int status)方法用来终止当前正在运行的Java虚拟机,其中的参数status用于表示当前发生的异常状态,通常指定为0,表示正常退出,否则表示异常终止。

点击此处
隐藏目录