System类
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类。
其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
1、成员变量
System类的属性有三个,分别是系统的标准输入,标准输出和标准错误输出。
1 public static PrintStream err; 2 3 public static PrintStream in; 4 5 public static PrintStream out;
通常标准输入指的是输入设备键盘,标准输出和标准错误输出指的是输出设备屏幕,如:
char c=System.in.read();//由键盘读入一个字节的数据送给字符变量C
System.out.println("Hello! Guys,");//由屏幕输出一个字符串。
2、成员方法
2.1 public static long currentTimeMillis()
返回以毫秒为单位的当前时间。
注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。
例如,许多操作系统以几十毫秒为单位测量时间。
当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
例如: long l = System. currentTimeMillis();
则获得的将是一个长整型的数字,该数字就是以差值表达的当前时间。
使用该方法获得的时间不够直观,但是却很方便时间的计算。
例如,计算程序运行需要的时间则可以使用如下的代码:
1 long start = System. currentTimeMillis(); 2 for(int i = 0;i < 100000000;i++){ 3 int a = 0; 4 } 5 6 long end = System. currentTimeMillis(); 7 long time = end – start;
则这里变量time的值就代表该代码中间的for循环执行需要的毫秒数,
使用这种方式可以测试不同算法的程序的执行效率高低,也可以用于后期线程控制时的精确延时实现。
2.2 arraycopy方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
该方法的作用是数组拷贝,也就是将一个数组中的内容复制到另外一个数组中的指定位置,
由于该方法是native方法,所以性能上比使用循环高效。
使用示例:
int[] a = {1,2,3,4};
int[] b = new int[5];
System.arraycopy(a,1,b,3,2);
该代码的作用是将数组a中,从下标为1开始,复制到数组b从下标3开始的位置,总共复制2个。
也就是将a[1]复制给b[3],将a[2]复制给b[4],这样经过复制以后数组a中的值不发生变化,而数组b中的值将变成{0,0,0,2,3}。
2.3 exit()方法
public static void exit(int status)
该方法的作用是退出程序
其中status的值为0代表正常退出,非零代表异常退出
使用该方法可以在图形界面编程中实现程序的退出功能等。
2.4 gc()方法
public static void gc()
该方法的作用是请求系统进行垃圾回收
至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况
System.gc()可用于垃圾回收。
当使用System.gc()回收某个对象所占用的内存之前,通过要求程序调用适当的方法来清理资源。
在没有明确指定资源清理的情况下,Java提高了默认机制来清理该对象的资源,就是调用Object类的finalize()方法。
finalize()方法的作用是释放一个对象占用的内存空间时,会被JVM调用。
而子类重写该方法,就可以清理对象占用的资源,该方法有没有链式调用,所以必须手动实现。
从程序的运行结果可以发现,执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源,
通过super.finalize()方式可以实现从下到上的finalize()方法的调用,即先释放自己的资源,再去释放父类的资源。
但是,不要在程序中频繁的调用垃圾回收,因为每一次执行垃圾回收,jvm都会强制启动垃圾回收器运行,
这会耗费更多的系统资源,会与正常的Java程序运行争抢资源,只有在执行大量的对象的释放,才调用垃圾回收最好
1 public class Person { 2 private String name; 3 private int age; 4 // ... ... 5 @Override 6 public String toString() { 7 return "Person [name=" + name + ", age=" + age + "]"; 8 } 9 10 @Override 11 protected void finalize() throws Throwable { 12 System.out.println("当前的对象被回收了" + this); 13 super.finalize(); 14 } 15 16 } 17 18 public class SystemDemo { 19 public static void main(String[] args) { 20 Person p = new Person("赵雅芝", 60); 21 System.out.println(p); 22 23 p = null; // 让p不再指定堆内存 24 System.gc(); 25 } 26 }
2.5 getProperty()方法
public static String getProperty(String key)
该方法的作用是获得系统中属性名为key的属性对应的值。
系统中常见的属性名以及属性的作用如下表所示。
2.6 getProperties
public static Properties getProperties()
键 |
相关值的描述 |
java.version |
Java 运行时环境版本 |
java.vendor |
Java 运行时环境供应商 |
java.vendor.url |
Java 供应商的 URL |
java.home |
Java 安装目录 |
java.vm.specification.version |
Java 虚拟机规范版本 |
java.vm.specification.vendor |
Java 虚拟机规范供应商 |
java.vm.specification.name |
Java 虚拟机规范名称 |
java.vm.version |
Java 虚拟机实现版本 |
java.vm.vendor |
Java 虚拟机实现供应商 |
java.vm.name |
Java 虚拟机实现名称 |
java.specification.version |
Java 运行时环境规范版本 |
java.specification.vendor |
Java 运行时环境规范供应商 |
java.specification.name |
Java 运行时环境规范名称 |
java.class.version |
Java 类格式版本号 |
java.class.path |
Java 类路径 |
java.library.path |
加载库时搜索的路径列表 |
java.io.tmpdir |
默认的临时文件路径 |
java.compiler |
要使用的 JIT 编译器的名称 |
java.ext.dirs |
一个或多个扩展目录的路径 |
os.name |
操作系统的名称 |
os.arch |
操作系统的架构 |
os.version |
操作系统的版本 |
file.separator |
文件分隔符(在 UNIX 系统中是“/”) |
path.separator |
路径分隔符(在 UNIX 系统中是“:”) |
line.separator |
行分隔符(在 UNIX 系统中是“/n”) |
user.name |
用户的账户名称 |
user.home |
用户的主目录 |
user.dir |
用户的当前工作目录 |