常用类Math和System和Random

本文介绍Java中Math类的常用数学运算方法,包括随机数生成、取整操作及求幂等,并详细解析了System类的应用场景,如标准输入输出流及垃圾回收的触发方式。同时介绍了Random类生成伪随机数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Math

Math 数学工具类  

属性:1. 常量 圆周率PI      double pi  = Math.PI;

      2.E自然底数    double e = Math.E;

方法:
//随机数
- double num = Math.random();  生成0-1之间的随机数
//求最值
- int max = Math.max(num1,num2);求最大值
- int min = Math.min(num1,num2);求最小值
//向上向下取整
- double s = Math.ceil(1.9);//向上取整 2
- double x = Math.floor(1.9);//向下取整  1
//小数的四舍五入
- double s = Math.round(1.28);//四舍五入小数点后一位  1
//求n的m次方  返回double类型
- double b = Math.pow(n,m);
//求平方根  返回double类型
- double b = Math.sqrt(4);//2
//求立方根  使用pow改造
- double b = Math.pow(8,1.0/3.0);m必须为double类型,否则就会出错
//求绝对值
- int i = Math.abs(-2);//2

……其余还有很多可以查看API文档

System

public final class System
/*final 修饰成员方法  方法不能被重写只能被继承
修饰变量  变为常量
修饰类  此类不能被继承
*/
    String 包含一些有用的类字段和方法,不能被实例化
    没有构造方法,不需要new创建
方法
in
  标准输入流 此流已打开并准备输入数据,通常此流对应于键盘输入或主机环境或用户指定的另一个输入源
new Scanner(System.in);等同于
InputStream i = System.in;//InputStream字节流 抽象类
new Scanner(i);    
out 
  标准输出流,此流已打开并准备输出数据,通常此流对应于显示器输出或主机环境或用户指定的另一个输出目标
  System.out.println();等同于
  PrintStream p = System.out;  //返回字节打印流
  out.println();的链式编程   //调用字节打印流中的方法
  
err
  标准错误输出流,此流已打开并准备接受输出数据
  System.err.println();打印出来后以红色展示
 
//JVM回收垃圾有自己的回收算法,我们干预不了
System.gc();运行垃圾回收器  催促垃圾回收器尽快回收,不是立刻

System.exit(0); 退出虚拟机   给 0 正常退出  
System.exit(1); 退出虚拟机   给 非0 强制退出  
在程序某处使用该方法  直接退出

//获取当前系统的毫秒值   1秒==1000毫秒
long l = System.currentTimeMillis();//返回的是long类型
获取当前距离计算机元年(19701100:00)的时间差,以毫秒为单位

Random

生成随机数据的类

此类用于生成伪随机数流,此类使用48位种子

构造方法
Random r = new Random();//空参构造
int i = r.nextInt();//生成随机整数,没有参数时,生成的随机数是在int范围内
int i = r.nextInt(100);//生成随机的0<=i<100范围内的数
int i = r.nextInt(100)+1//生成0<i<=100之间的随机数
double d = r.nextDouble();//0<d<1

byte b = new byte[10];
r.nextBytes(b);//随机生成一些byte范围的数,添到数组中

有参构造
Random(long seed);//使用单个long种子创建一个新的随机数生成器
Random r = new Random();//没有种子时每次生成的随机数都不一样
Random r = new Random(1L);//有种子一次生成随机数后,之后再生成就不会变了


### Math.randomRandom.nextInt 的区别及用法 #### 1. **实现机制** `Math.random()` 是 Java 中的一个静态方法,内部调用了 `Random.nextDouble()` 方法来生成一个介于 `[0, 1)` 范围内的双精度浮点数[^4]。而 `Random.nextInt(n)` 则是 `java.util.Random` 类中的一个实例方法,用于生成一个指定范围内的整数值。 两者的核心差异在于其实现方式以及返回值类型的不同。`Math.random()` 不依赖任何显式的种子设置,因此每次运行程序都会得到不同的随机数序列[^3]。然而,`Random.nextInt(n)` 可以通过设定相同的种子值(seed),使得不同对象生成的随机数序列完全一致[^2]。 #### 2. **返回值类型** - `Math.random()` 返回的是一个 `double` 值,其取值范围为 `[0.0, 1.0)`。 - `Random.nextInt(n)` 返回的是一个 `int` 值,其取值范围为 `[0, n)`。 如果需要生成特定范围的整数,通常会结合 `Math.random()` 使用乘法运算并向下取整: ```java // 使用 Math.random() 生成 [0, 10) 范围内的整数 int randomNumber = (int)(Math.random() * 10); ``` 相比之下,`Random.nextInt(n)` 更加直观高效,因为它直接提供了限定范围的功能。 #### 3. **可重复性** 由于 `Random` 对象可以接受种子参数,在初始化时传入相同的种子将会导致该对象生成固定的随机数序列。这种特性对于测试场景非常有用,因为可以通过固定种子重现同样的输入数据。而 `Math.random()` 并不支持这样的功能,它总是基于当前时间或其他不可控因素动态调整种子值。 #### 4. **线程安全性** 需要注意的是,默认情况下创建多个独立的 `Random` 实例可能会引发性能瓶颈或者同步问题,特别是在多线程环境中共享同一个 `Random` 实例时。虽然官方文档指出某些版本已经优化了这一点,但对于高并发需求的应用来说仍然推荐考虑更高效的解决方案比如 ThreadLocalRandom。至于 `Math.random()` ,它是线程安全的,但由于全局状态的存在可能不如局部控制下的效率那么理想。 以下是两个函数简单对比的例子代码展示它们如何工作: ```java import java.util.Random; public class Main { public static void main(String[] args){ // Using Math.random() for(int i=0;i<5;i++) { System.out.println((int)(Math.random()*10)); } System.out.println("======="); // Using Random.nextInt() Random rand = new Random(); for(int j=0;j<5;j++) { System.out.println(rand.nextInt(10)); } System.out.println("======="); // Demonstrating seed effect with Random Random r1 = new Random(7L); Random r2 = new Random(7L); for(int k=0;k<5;k++){ System.out.println(r1.nextInt(10)+", "+r2.nextInt(10)); } } } ``` 此段代码分别展示了两种方法产生的随机数形式及其特点。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值