从零开始学Java-常用API:Math 、System、Runtime

142 阅读6分钟

目录

  • Math
  • System
  • Runtime

Math

Math是一个帮助我们用于进行数学计算的工具类,私有化构造方法,所有的方法都是静态的,所以调用的时候直接用类名.方法就可以了。

  • 成员变量
方法名说明
public static int abs(int a)获取参数绝对值
public static double ceil(double a)向上取整
public static double floor(double a)向下取整
public static int round(float a)四舍五入
public static int max(int a,int b)获取两个int值中的较大值
public static int min(int a,int b)获取两个int值中的较小值
public static double pow(double a,double b)返回a的b次幂的值
public static double sqrt(double a)返回a的平方根
public static double cbrt(double ab)返回a的立方根

下面我们来实操一下吧:

abs获取参数的绝对值:

System.out.println(Math.abs(88));           // 88
System.out.println(Math.abs(-88));          // 88

cail 向上取整

System.out.println(Math.ceil(12.34));       // 13.0
System.out.println(Math.ceil(-12.34));      // -12.0

floor 向下取整

System.out.println(Math.floor(12.34));      // 12.0
System.out.println(Math.floor(-12.34));     // -13.0

round 四舍五入

System.out.println(Math.round(12.34));      // 12
System.out.println(Math.round(-12.34));     // -12

max 获取两个int值中的较大值

System.out.println(Math.max(12.34,15.66));  // 15.66

min 获取两个int值中的较小值

System.out.println(Math.min(12.34,15.66));  // 12.34

pow 返回a的b次幂的值

System.out.println(Math.pow(8,2));          // 64

sqrt 返回a的平方根

System.out.println(Math.sqrt(4));           // 2

cbrt 返回a的立方根

System.out.println(Math.cbrt(8));           // 2

下面我们来做个案例看一下吧:

  • 判断一个数是不是质数:

我们先来看一下之前的写法:

public static boolean isPrime1(int number){
    for (int i = 2; i < number; i++) {
        if(number % i == 0){
            return false;
        }
    }
    return true;
}

我们再来看一下使用Math方法:

public static boolean isPrime2(int number){
    for (int i = 2; i < Math.sqrt(number); i++) {
        if(number % i == 0){
            return false;
        }
    }
    return true;
}

是不是感觉这种的写法比较麻烦呢,其实不是的,这种的效率是最高的,我们下面会学到一个时间的API,就知道他的效率怎么高啦。

System

System也是一个工具类,提供了一些与系统相关的方法。我们一起往下看吧:

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

我们下面来实操一下吧:

exit(int status):终止当前运行的 Java 虚拟机

System.exit(0);
System.out.println("看看我执行了吗?");

我们来运行看一下:

image.png

可以看到他并没有执行下面的那行代码,而是终止掉了虚拟机。下面我们来说一下他的参数吧:

方法的形参:状态码:

0:表示当前虚拟机是正常停止

非0:表示当前虚拟机异常停止

currentTimeMillis:返回当前系统的时间毫秒值形式

是什么意思呢?其实呀计算机是有时间原点的,而时间原点是1970年1月1日 8:00:00他就是表示从时间原点到现在时间过了多久,我们来运行看一下吧:

image.png

到这里我们来看回上一个求质数的案例:

以100000为例,我们先来看一下以前的写法所用的时间:

long start = System.currentTimeMillis();
for (int i = 1; i < 100000; i++) {
    boolean flag = isPrime1(i);
    if(flag){
        System.out.println(i);
    }
}
long end = System.currentTimeMillis();
System.out.println("消耗的时间:" + (end - start));

image.png

这里是不是消耗了一秒钟呀,我们再来看一下用数字方法写的那个质数:

long start = System.currentTimeMillis();
for (int i = 1; i < 100000; i++) {
    boolean flag = isPrime2(i);
    if(flag){
        System.out.println(i);
    }
}
long end = System.currentTimeMillis();
System.out.println("消耗的时间:" + (end - start));

image.png

怎么样,是不是利用数字方法的效率更高呀,是的。

arraycopy 拷贝数组

下面我们来看一下这个有什么用吧:

首先先来定义两个数组:

int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arr2 = new int[10];

接下来我们来拷贝一下吧:

System.arraycopy(arr1,0,arr2,0,10);

image.png

是不是成功拷贝过来了呀,那这里的参数是什么意思呢?我们来说一下:

image.png

  1. 参数一:数据源,要拷贝的数据从哪个数组而来
  2. 参数二:从数据源数组中的第几个索引开始拷贝
  3. 参数三:目的地,我要把数据拷贝到哪个数组中
  4. 参数四:目的地数组的索引。
  5. 参数五:拷贝的个数

Runtime

Runtime表示当前虚拟机的运行环境

方法名说明
public static Runtime getRuntime()当前系统的运行环境对象
public void exit(int status)停止虚拟机
public int availableProcessors()获得CPU的线程数
public long maxMemory()JVM能从系统中获取总内存大小(单位byte)
public long totalMemory()JVM已经从系统中获取总内存大小(单位byte)
public long freeMemory()JVM剩余内存大小(单位byte)
public Process exec(string command)运行cmd命令

下面我们来实操一下吧:

Runtime getRuntime() 当前系统的运行环境对象

// 获取runtime的对象
Runtime r1 = Runtime.getRuntime();
Runtime r2 = Runtime.getRuntime();
System.out.println(r1 == r2);           // true

exit(int status) 停止虚拟机

// exit 停止虚拟机
Runtime.getRuntime().exit(0);
System.out.println("看看我执行了吗?");

image.png

我们可以看到什么都没有执行,那就表示停止虚拟机的意思!

availableProcessors() 获得CPU的线程数

// availableProcessors() 获得CPU的线程数
System.out.println(Runtime.getRuntime().availableProcessors());

我们来运行看一下:

image.png

因为我的电脑是四核八线程的,所以就打印出了一个8

maxMemory() JVM能从系统中获取总内存大小(单位byte)

// maxMemory() JVM能从系统中获取总内存大小(单位byte)
System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);

image.png

这个4056就表示他从操作系统中能获取到4个g的内存。

totalMemory() JVM已经从系统中获取总内存大小(单位byte)

// totalMemory() JVM已经从系统中获取总内存大小(单位byte)
System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);   // 254

image.png

这个254就表示虚拟机已经获取了大约254兆。

freeMemory() JVM剩余内存大小(单位byte)

// freeMemory() JVM剩余内存大小(单位byte)
System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);    // 251

image.png

而这个251就表示还剩下251兆,刚才用掉了3兆的内存。

exec(string command) 运行cmd命令

// exec(string command) 运行cmd命令
Runtime.getRuntime().exec("notepad");

而这个是表示运行cmd命令,打开notepad这个记事本软件。

下面我们来说一个好玩的吧:

  • shutdown:关机(加上参数才能执行)
    • -s:默认在1分钟之后关机
    • -s -t:指定关机时间
    • -a:取消关机操作
    • -r:关机并重启

好啦,本篇文章就学习到这里,我们下期继续来学习更加常用的API操作,我们下期不见不散哟!

==最后非常感谢您的阅读,也希望能得到您的反馈  ==