首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 核心工具类 API 详解(一):从 Math 到 Runtime 的实用指南

Java 核心工具类 API 详解(一):从 Math 到 Runtime 的实用指南

作者头像
钮祜禄.爱因斯晨
发布2025-07-20 09:23:35
发布2025-07-20 09:23:35
8600
代码可运行
举报
运行总次数:0
代码可运行

文章主页-爱因斯晨

文章专栏-Java专栏

加速更新中!感谢大家支持和陪伴! 祝兄弟们得偿所愿天天开心!文末有投票哦!

一、Math

不需要背,要学会记一下类名和类的作用,养成查阅API帮助文档的习惯

是一个帮助我们用于进行数学计算的工具类

私有化静态方法,里面的所有的方法全是静态的

Math类的常用方法

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
代码运行次数:0
运行
复制
package demo01;

public class MathDemo01 {
    public static void main(String[] args) {
        //abs 获取参数的绝对值
        System.out.println(Math.abs(-3.14));
        System.out.println(Math.abs(3.14));
        //bug解释
        //以int型为例,int的取值范围是-2147483648到2147483647
        //如果参数是-2147483648,那么取绝对值后就会超出int的取值范围,所以会返回-2147483648
        //如果参数是-2147483647,那么取绝对值后就会返回2147483647
        //可以索引到源码中的abs方法,发现abs方法的返回值是int类型,所以会返回-2147483648
        System.out.println(Math.abs(-2147483648));

        //ceil 向上取整 数学中的进一法,往数轴中的正方向取整,即大于等于该数的最小整数
        System.out.println(Math.ceil(3.9));
        System.out.println(Math.ceil(-3.9));

        //floor 向下取整 数学中的去一法,往数轴中的负方向取整,即小于等于该数的最大整数
        System.out.println(Math.floor(3.9));
        System.out.println(Math.floor(-3.9));

        //round 四舍五入
        System.out.println(Math.round(3.4));
        System.out.println(Math.round(-3.6));
        System.out.println(Math.round(-3.5));

        //pow 求幂
        System.out.println(Math.pow(2,3));

        //max 获取最大值
        System.out.println(Math.max(3.4,5.6));

        //random 获取随机数
        System.out.println(Math.random());

    }

}
在这里插入图片描述
在这里插入图片描述

关于abs我们可以回溯源码,可以看到他们做了一个判断

代码语言:javascript
代码运行次数:0
运行
复制
public static long absExact(long a) {
        if (a == Long.MIN_VALUE)
            throw new ArithmeticException(
                "Overflow to represent absolute value of Long.MIN_VALUE");
        else
            return abs(a);
    }

    /**
     * Returns the absolute value of a {@code float} value.
     * If the argument is not negative, the argument is returned.
     * If the argument is negative, the negation of the argument is returned.
     * Special cases:
     * <ul><li>If the argument is positive zero or negative zero, the
     * result is positive zero.
     * <li>If the argument is infinite, the result is positive infinity.
     * <li>If the argument is NaN, the result is NaN.</ul>
     *
     * @apiNote As implied by the above, one valid implementation of
     * this method is given by the expression below which computes a
     * {@code float} with the same exponent and significand as the
     * argument but with a guaranteed zero sign bit indicating a
     * positive value:<br>
     * {@code Float.intBitsToFloat(0x7fffffff & Float.floatToRawIntBits(a))}
     *
     * @param   a   the argument whose absolute value is to be determined
     * @return  the absolute value of the argument.
     */

在max判断中,其实源码中也做了一个三元计算符的判断

代码语言:javascript
代码运行次数:0
运行
复制
@IntrinsicCandidate
    public static double max(double a, double b) {
        if (a != a)
            return a;   // a is NaN
        if ((a == 0.0d) &&
            (b == 0.0d) &&
            (Double.doubleToRawLongBits(a) == negativeZeroDoubleBits)) {
            // Raw conversion ok since NaN can't map to -0.0.
            return b;
        }
        return (a >= b) ? a : b;
    }

    /**
     * Returns the smaller of two {@code int} values. That is,
     * the result the argument closer to the value of
     * {@link Integer#MIN_VALUE}.  If the arguments have the same
     * value, the result is that same value.
     *
     * @param   a   an argument.
     * @param   b   another argument.
     * @return  the smaller of {@code a} and {@code b}.
     */

练习: 判断一个数是否为质数

代码语言:javascript
代码运行次数:0
运行
复制
public static boolean isPrime(int number){
    for (int i = 2 ; i < number ; i++){
        if (number%i==0){
            return false ;
        }
    }
    return true ;
}

我们发现这样效率太慢了,于是我们发现一个数的因子在平方根的左边,于是我们可以从左边遍历,这样可以节省时间

代码语言:javascript
代码运行次数:0
运行
复制
public static boolean isPrime(int number){
    for (int i = 2 ; i < Math.sqrt(number) ; i++){
        if (number%i==0){
            return false ;
        }
    }
    return true ;
}

练习2:

要求1:统计一共有多少个水仙花数

代码语言:javascript
代码运行次数:0
运行
复制
package demo01;

public class MathDemo02 {
    public static void main(String[] args) {
        //要求1:统计一共有多少个水仙花数字
        //水仙花数:100-999之间的数字
        int count = 0;
        for (int i = 100; i < 1000; i++) {
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;

            //判断是否为水仙花数
            double sum  =Math.pow(ge,3) + Math.pow(shi,3) + Math.pow(bai,3);
            if (sum == i) {
                count++;
                System.out.println(i);
            }
        }
        System.out.println(count);

    }
}

要求2:(课后作业)证明没有两位的自幂数

代码语言:javascript
代码运行次数:0
运行
复制
package demo01;

public class MathDemo03 {
    public static void main(String[] args) {
        //要求1:统计一共有多少个水仙花数字
        //水仙花数:100-999之间的数字
        int count = 0;
        for (int i = 10; i < 99; i++) {
            int ge = i % 10;
            int shi = i / 10 % 10;


            //判断是否为水仙花数
            double sum  =Math.pow(ge,2) + Math.pow(shi,2);
            if (sum == i) {
                count++;
                System.out.println(i);
            }
        }
        System.out.println(count);
    }
}

要求3:统计有多少个四叶玫瑰数

代码语言:javascript
代码运行次数:0
运行
复制
package demo01;



public class MathDemo04 {
    public static void main(String[] args) {
        //要求1:统计一共有多少个水仙花数字
        //水仙花数:100-999之间的数字
        int count = 0;
        for (int i = 1000; i < 9999; i++) {
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            int qian = i / 1000 % 10;

            //判断是否为水仙花数
            double sum  =Math.pow(ge,4) + Math.pow(shi,4) + Math.pow(bai,4)+Math.pow(qian,4);
            if (sum == i) {
                count++;
                System.out.println(i);
            }
        }
        System.out.println(count);

    }
}

二、System

System也是一个工具类,提供了一个选哪个与系统相关的方法

计算机中的时间原点:1970年1月1日 00:00:00 也就是C语言的生日

我们是东八区所以是 1970年1月1日 08:00:00

代码语言:javascript
代码运行次数:0
运行
复制
package demo02;

public class SystemDemo01 {
    public static void main(String[] args) {
        //终止当前的虚拟机推出程序
//    public static void exit(int status) {
//        System.out.println("退出程序");
//    }
        //方法的形参:
        //状态码:
        //0:正常退出
        //非0:异常退出
        System.exit(0);
        System.out.println("看看我执行了吗?");

    }


}

显而易见,程序在输出语句前就退出了执行

代码语言:javascript
代码运行次数:0
运行
复制
package demo02;

public class SystemDemo01 {
    public static void main(String[] args) {
        //终止当前的虚拟机推出程序
//    public static void exit(int status) {
//        System.out.println("退出程序");
//    }
        //方法的形参:
        //状态码:
        //0:正常退出
        //非0:异常退出
        //System.exit(0);
       // System.out.println("看看我执行了吗?");

        //获取当前系统的毫秒值
        long l = System.currentTimeMillis();
        System.out.println(l);


    }
}

这个类可以获得程序运行的时间

代码语言:javascript
代码运行次数:0
运行
复制
package demo02;

public class SystemDemo01 {
    public static void main(String[] args) {
        //终止当前的虚拟机推出程序
//    public static void exit(int status) {
//        System.out.println("退出程序");
//    }
        //方法的形参:
        //状态码:
        //0:正常退出
        //非0:异常退出
        //System.exit(0);
       // System.out.println("看看我执行了吗?");

        //获取当前系统的毫秒值
        //long l = System.currentTimeMillis();
        //System.out.println(l);

        //拷贝数组
        int [] arr1 = {1,2,3,4,5,6,7,8,9};
        int [] arr2 = new int [9];
        //参数1:源数组
        //参数2:源数组的起始索引
        //参数3:目标数组
        //参数4:目标数组的起始索引
        //参数5:拷贝的个数
        System.arraycopy(arr1, 0, arr2, 0, 9);

        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i]);
        }

    }
}

第三个方法细节:

1.如果数据源数组和目的地数组都是基本数据类型,那么两者的类型必须保持一致,否则会报错

2.再拷贝的时候需要考虑数组的长度,如果超出范围也会报错

3.如果数据源数组和目的地数组都是引用数据类型,那么子类类型可以赋值给父类类型

三、Runtine

代码语言:javascript
代码运行次数:0
运行
复制
package demo03;

public class RoutineDemo01 {
    public static void main(String[] args) {
        //1.获取Runtime对象
        Runtime runtime = Runtime.getRuntime();

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

        //3.获取虚拟机的最大内存
        long maxMemory = runtime.maxMemory();
        System.out.println("虚拟机的最大内存"+maxMemory);

        //4.获得CPU的核数
        int availableProcessors = runtime.availableProcessors();
        System.out.println("CPU的核数"+availableProcessors);

        //5.获得JVM的总内存
        long totalMemory = runtime.totalMemory();
        System.out.println("JVM的总内存"+totalMemory/1024/1024+"M");

        //6.获得JVM的空闲内存
        long freeMemory = runtime.freeMemory();
        System.out.println("JVM的空闲内存"+freeMemory/1024/1024+"M");

        //7.运行cmd命令
        Runtime.getRuntime().exec("notepad.exe");


    }
}

在第29行代码中会遇到红色波浪线,这就是我们后面要学到的异常

我们可以将鼠标点击红色波浪线然后Alt+回车

修改后的代码:

代码语言:javascript
代码运行次数:0
运行
复制
package demo03;

import java.io.IOException;

public class RoutineDemo01 {
    public static void main(String[] args) throws IOException {
        //1.获取Runtime对象
        Runtime runtime = Runtime.getRuntime();

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

        //3.获取虚拟机的最大内存
        long maxMemory = runtime.maxMemory();
        System.out.println("虚拟机的最大内存"+maxMemory);

        //4.获得CPU的核数
        int availableProcessors = runtime.availableProcessors();
        System.out.println("CPU的核数"+availableProcessors);

        //5.获得JVM的总内存
        long totalMemory = runtime.totalMemory();
        System.out.println("JVM的总内存"+totalMemory/1024/1024+"M");

        //6.获得JVM的空闲内存
        long freeMemory = runtime.freeMemory();
        System.out.println("JVM的空闲内存"+freeMemory/1024/1024+"M");

        //7.运行cmd命令
        Runtime.getRuntime().exec("notepad.exe");


    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章主页-爱因斯晨
  • 文章专栏-Java专栏
  • 一、Math
    • Math类的常用方法
  • 二、System
  • 三、Runtine
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档