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,表示正常退出,否则表示异常终止。