java Math类 和 System类 详解(通俗易懂)

简介: java API专题——常用类Math类 和 System类。
  • Math类介绍
  • Math类常用方法及演示
  • System类简介
  • System类常用方法及演示

一、前言

本节内容是我们《API-常用类》专题的第四小节了。本节内容主要讲Math类和System类, 内容包括 Math类介绍 Math类常用方法 System类介绍 System类常用方法 。该小节内容基本不涉及底层源码,只是因其使用频率较可观,本身也没什么难度,所以给大家演示一下它们的常用方法,大家可以放心食用。 注意 : 代码中的注释也很重要; 不要眼高手低,自己敲一遍才能知道怎么用。 点击侧边栏目录或者文章开头的目录可以跳转。良工不示人以朴,所有文章都会适时改进。大家如果有什么问题,都可以在评论区一块儿交流,或者私信up。 感谢阅读!

二、Math类介绍

诚然,我们目前的编程中用到数学不算多,因为我们还没讲算法。但即便如此,简单的 + - * / 有时并不能满足我们对计算的需求。我们可以使用java提供的Math类来解决这个问题, java Math类中封装了常用的数学运算,包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数 Math类属于java.base模块,java.lang包下,如下图所示 :

image.png

我们再来看看Math类的源码,如下 :

image.png

可以看到,Math类被final关键字修饰,因此Math类不可被继承。同时,Math类的构造器也被私有化了,并且源码中也给出了标注,Math类不可被实例化。


三、Math类常用方法

0.前言

在演示Math类常用方法前,顺便提一嘴Math类的两个共有静态常量E和PI,估计大家看名字也能猜出来这是干嘛的。E是自然对数,PI是圆周率。如下图所示 :

image.png

1.static ... abs(...)

返回当前数值的绝对值。可以是int,long,float, double四种类型。

2.static double pow(double a, double b)

设传入的两个形参是a和b,返回a的b次方。(求幂运算)

3.static double ceil(double a)

向上取整,返回大于等于当前形参的最小整数。

4.static double floor(double a)

向下取整,返回小于等于当前形参的最大整数。

5.static ... round(...)

四舍五入取整,支持传入float类型和double类型,对应返回类型分别为int类型和long类型。

6.static double sqrt(double a)

对传入的形参求开方。即返回当前形参的算术平方根。

7.static double random()

返回一个大于等于0.0小于1.0的随机数。即返回区间[0.0, 1.0)内的一个随机数。

PS : 如果要求[a, b]之间的一个随机整数,可以使用如下公式——

(int) (a + Math.random() * (b - a + 1))  (可令a = 0来证明)

8.static ... max(...)

返回两个数中的最大值。同abs方法一样,支持int,long,float,double四种类型。

9.static ... min(...)

返回两个数中的最小值。同abs方法一样,支持int,long,float,double四种类型。

Δ演示 :

up以Math_类为演示类,代码如下 :

packagecsdn.knowledge.api.System_Math;
publicclassMath_ {
publicstaticvoidmain(String[] args) {
//演示 : Math类常用方法//1 —— static ... abs(...)System.out.println("-233的绝对值 = "+Math.abs(-233));
System.out.println("6.666的绝对值 = "+Math.abs(6.666));
System.out.println("6.666的绝对值 = "+Math.abs(-11.11));
System.out.println("6.666的绝对值 = "+Math.abs(5));
System.out.println("===============================");
//2 —— static double pow(double a, double b)System.out.println("3 的 2次方 = "+Math.pow(3, 2));
System.out.println("2 的 3次方 = "+Math.pow(2, 3));
System.out.println("4 的 2次方 = "+Math.pow(4, 2));
System.out.println("2 的 10次方 = "+Math.pow(2, 10));
System.out.println("===============================");
//3 —— static double ceil(double a)System.out.println("2.33向上取整 = "+Math.ceil(2.33));
System.out.println("2.99向上取整 = "+Math.ceil(2.99));
System.out.println("3.01向上取整 = "+Math.ceil(3.01));
System.out.println("-3.01向上取整 = "+Math.ceil(-3.01));
System.out.println("===============================");
//4 —— static double floor(double a)System.out.println("2.33向下取整 = "+Math.floor(2.33));
System.out.println("2.99向下取整 = "+Math.floor(2.99));
System.out.println("4.01向下取整 = "+Math.floor(4.01));
System.out.println("-4.01向下取整 = "+Math.floor(-4.01));
System.out.println("===============================");
//5 —— static ... round(...)System.out.println("2.499四舍五入 = "+Math.round(2.499));
System.out.println("2.501四舍五入 = "+Math.round(2.501));
System.out.println("-3.33四舍五入 = "+Math.round(-3.33));
System.out.println("-6.88四舍五入 = "+Math.round(-6.88));
System.out.println("===============================");
//6 —— static double sqrt(double a)System.out.println("9开根号 = "+Math.sqrt(9));
System.out.println("9.0开根号 = "+Math.sqrt(9.0));
System.out.println("1.21开根号 = "+Math.sqrt(1.21));
System.out.println("256开根号 = "+Math.sqrt(256));
System.out.println("===============================");
//7 —— static double random()System.out.println("返回[0.0, 1.0)区间内的一个随机数:"+Math.random());
System.out.println("返回[0.0, 1.0)区间内的一个随机数:"+Math.random());
System.out.println("返回一个2~11间的随机整数 = "+ (int) (2+Math.random() * (11-2+1)));
System.out.println("返回一个2~11间的随机整数 = "+ (int) (2+Math.random() * (11-2+1)));
System.out.println("===============================");
//8 —— static double random()System.out.println("3.2 和 2.3中的最大值 = "+Math.max(3.2, 2.3));
System.out.println("-2.01 和 -1.99中的最大值 = "+Math.max(-2.01, -1.99));
System.out.println("2333 和 3333中的最大值 = "+Math.max(2333, 3333));
System.out.println("-666 和 11中的最大值 = "+Math.max(-666, 11));
System.out.println("===============================");
//9 —— static double random()System.out.println("3.2 和 2.3中的最小值 = "+Math.min(3.2, 2.3));
System.out.println("-2.01 和 -1.99中的最小值 = "+Math.min(-2.01, -1.99));
System.out.println("2333 和 3333中的最小值 = "+Math.min(2333, 3333));
System.out.println("-666 和 11中的最小值 = "+Math.min(-666, 11));
    }
}

运行结果 :

image.png

image.png

image.png


四、System类简介

System类属于java.base模块,java.lang包下,如下 :

image.png

我们再来看看System类的源码,如下 :

image.png

同样,System类不可被继承(final修饰),不可被实例化(构造器私有)。


五、System类常用方法

1.static void exit(int status)

退出当前程序,结束正在运行的java虚拟机。形参= 0表示以正常状态退出。

Δ演示 :

以System_类为演示类,代码如下 :

packagecsdn.knowledge.api.System_Math;
publicclassSystem_ {
publicstaticvoidmain(String[] args) {
//演示 : System类常用方法//1.exit()System.out.println("CSDN yyds!");
System.exit(0);
System.out.println("这句话能否输出?");
    }
}

运行结果 :

image.png

可以看到,在执行exit语句后,下面的输出语句未能执行。

2.static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

第一眼看到这函数是不是有点懵😂?雀氏,我们平时并不常见这种形参有这么多的情况。

该方法可以用于数组的拷贝,可以将原数组中的指定内容拷贝到指定新数组中的指定位置。

PS : 平时我们拷贝数组更多使用的是Arrays类中的copyOf方法,实际上copyOf方法在底层调用的就是System类中的arraycopy方法。大家有兴趣可以去看看Arrays类的源码或者Debug一下,我这儿就不演示了,这个话题要是说起来就没完没了了。

具体每个形参有什么作用,源码中也作了批注,如下 :

/**Params:src – the source array. srcPos – starting position in the source array. dest – the destination array. destPos – starting position in the destination data. length – the number of array elements to be copied.*/

当然,up还是相信大家的英文水平的😎。不过为了凑点字数,还是给大家翻译解读一下。如下 :

第一个形参src —— 代表了数据来源的数组,即原数组。 第二个形参srcPos —— 代表了你要从原数组的哪个位置(索引)处开始拷贝。 第三个形参dest —— 代表了接收数据的目的地数组,即新数组。 第四个形参destPos —— 代表了你想在新数组的哪个位置(索引)处存放拷贝过来的内容。 第五个形参length —— 代表了原数组中你想拷贝的内容的长度。

所以,该方法总的意思就是"把src数组中从srcPos索引开始共length个元素拷贝到dest数组中的从destPos索引开始处"

实际上,我们往往使用"System.arraycopy(array1, 0, array2, 0, array1.length())"的格式,即将原数组中的内容全部拷贝至新数组。

Δ演示 :

仍以System_类为演示类,代码如下 :

packagecsdn.knowledge.api.System_Math;
importjava.util.Arrays;
publicclassSystem_ {
publicstaticvoidmain(String[] args) {
//演示 : System类常用方法//2.arraycopy()int[] array1=newint[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] array2=newint[array1.length];
System.arraycopy(array1, 0, array2, 0, array1.length);
System.out.println("拷贝后的新数组array2 = "+Arrays.toString(array2));
int[] array3=newint[25];
System.arraycopy(array1, 0, array3, 11, 10);
System.out.println("拷贝后的新数组array3 = "+Arrays.toString(array3));
int[] array4=newint[5];
System.arraycopy(array1, 2, array4, 0, 3);
System.out.println("拷贝后的新数组array4 = "+Arrays.toString(array4));
    }
}

运行结果 :

image.png

PS :

①如果你的目的地数组(新数组)的长度小于你想拷贝的内容的长度,IDEA会报ArrayIndexOutOfBoundsException,如下图所示 :

image.png

②如果原数组与新数组类型不兼容,IDEA会报ArrayStoreException,如下图所示 :

image.png

3.static long currentTimeMillis()

返回当前时间点距离1970年1月1日午夜12:00时间点(即1970-1-1-00:00:00)的毫秒数。

有小伙伴儿可能会有疑问,为啥子是1970-1-1捏?

诺,我直接把百度结果给你搬过来。如下图所示 :

image.png

Δ演示 :

以System_类为演示类,代码如下 :

packagecsdn.knowledge.api.System_Math;
importjava.util.Arrays;
publicclassSystem_ {
publicstaticvoidmain(String[] args) {
//演示 : System类常用方法//3.currentTimeMillis()Longtime_Start=System.currentTimeMillis();
System.out.println("当前时间距离1970-1-1-00:00:00的毫秒数 = "+time_Start);
for (inti=0; i<10; i++) {
System.out.print("牛逼 ");
        }
Longtime_End=System.currentTimeMillis();
System.out.println("\n执行完牛逼for循环用了多少毫秒?"+ (time_End-time_Start));
    }
}

运行结果 :

image.png


六、总结

🆗 ,以上就是关于Math类 和 System类的全部内容了。希望这篇博文的内容分享,能给大家带来帮助。总的来看,目前阶段这两个常用类对于大家来说,更多在于如何使用它,偏向于应用。大家不需要扣太细,有兴趣倒是可以把我们之前讲过的String类,StringBuffer类,StringBuilder类的底层去扣一扣,但现阶段也是浅尝辄止就好。API专题的下一小节,up准备来讲讲Date类 和 Calander类,我们不见不散 😆 感谢阅读!
目录
相关文章
|
5天前
|
Java
【Java】Math、System、RunTime、BigDecimal类常用方法
【Java】Math、System、RunTime、BigDecimal类常用方法
|
3天前
|
安全 Java API
16 个最常用的 Java 实用程序类
【8月更文挑战第16天】
10 1
16 个最常用的 Java 实用程序类
|
1天前
|
SQL Java Apache
实时计算 Flink版操作报错合集之使用parquet时,怎么解决报错:无法访问到java.uti.Arrays$ArrayList类的私有字段
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4天前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
5天前
|
设计模式 人工智能 Java
Java 如何使用单例类
Java 如何使用单例类
5 1
|
5天前
|
Java
【Java】static 类方法中注意事项
【Java】static 类方法中注意事项
|
6天前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
27 7
|
5天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
5天前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。
|
3天前
|
存储 缓存 安全
深度剖析Java HashMap:源码分析、线程安全与最佳实践
深度剖析Java HashMap:源码分析、线程安全与最佳实践