System类
介绍
Java的System类是一个非常重要的类,它包含了一系列用于与Java平台交互的静态方法和变量。这些方法和变量被用来访问系统属性、环境变量、标准输入输出流以及进行内存管理等。
由于System类中的所有方法和变量都是静态的,因此你可以直接通过类名来调用它们,而不需要创建System类的实例。
常用方法
- System.exit(int x):退出当前程序,其中的参数 x 一般为0,表示正常退出,非零表示异常或错误时退出。
- System.arraycopy(num1, int a,num2,int b, int x):将指定的源数组 num1 复制指定数量的数组元素到目标数组 num2 的指定位置。
其中 num1 代表源数组,从该数组中取元素开始复制。
int a代表从 num1 数组的该索引位置开始复制。
num2代表目标数组,即复制到该数组中。
int b代表复制到num2的该索引位置。
int x表示所需复制的长度(若x不符合逻辑系统会报错)。
int[] num1 = {1, 2, 3, 4, 5};
int[] num2 = new int[5];
//一 System.arraycopy(num1,0,num2,0,num1.length);
//此时数组num2的值:[1,2,3,4,5]
//二 System.arraycopy(num1,1,num2,2,3);
//此时数组num2的值:[0,0,2,3,4]
//三 System.arraycopy(num1,2,num2,0,3);
//此时数组num2的值:[3,4,5,0,0]
//四 System.arraycopy(num1,2,num2,0,5);
//报错
但该方法不推荐使用,一般使用Arrays.copyOf()方法代替System.arraycopy()方法。
- System.currentTimeMillis():返回自1970年1月1日00:00:00 GMT(格林尼治标准时间)以来的毫秒数。这个方法常用于计算时间差或生成时间戳。
System.out.println(System.currentTimeMillis());
//输出1722858683310
-
System.gc():请求垃圾回收器执行垃圾回收。在之前学习Object时已有提及,在此不再赘述。注意,这只是个请求,JVM可以忽略它。
BigInteger和BigDecimal类
介绍
BigInteger和BigDecimal类都是用于处理大数的,但它们的应用场景和内部实现有所不同。这两个类都位于 java.math 包中,因此在使用前需要导入这个包。
BigInteger类是不可变的,所以对 BigInteger 进行加减乘除时,不能直接进行 + - * / ,需要使用对应的方法。适合存放比较大的整形。
BigDecimal类也是不可变的,同理也不能直接进行 + - * /, 需要使用对应的方法。适合存放精度更高的浮点型(小数)。
BigInteger常用方法
创建BigInteger对象
//第一种:使用字符串构造方法
BigInteger num1=new BigInteger("1234567899999999");
//或者
String str = "1234567899999999";
BigInteger num2=new BigInteger(str);
//第二种:使用静态工厂方法
BigInteger num3=BigInteger.valueOf(1234567899999999l);
加
- BigInteger1.add(BigInteger2):返回两个BigInteger相加的和。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
BigInteger num3=num1.add(num2);//将相加所得的值赋给num3
//此时num3的值为12300099999
减
- BigInteger1.subtract(BigInteger2):返回两个BigInteger相减的差。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
num2=num1.subtract(num2);//将相减所得的值赋给num3
//此时num3的值为12299900001
乘
- BigInteger1.multiply(BigInteger2):返回两个BigInteger相乘的积。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
num2=num1.multiply(num2);//将相乘所得的值赋给num3
//此时num3的值为1229987700000000
除
- BigInteger1.divide(BigInteger2):返回两个BigInteger相除的商。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
num2=num1.divide(num2);//将相除所得的值赋给num3
//此时num3的值为123001
BigDecimal常用方法
创建BigDecimal对象
第一种:使用构造方法
这是最直接的方法,你可以通过传递 String、double、long 等类型的参数来调用 BigDecimal 的构造方法。但是,由于 double 类型的精度问题,使用 double参数可能会导致精度不准确。
//使用构造方法
BigDecimal num1 = new BigDecimal("1.234567899999999");//使用字符串构造
BigDecimal num3 = new BigDecimal(1.234567899999999d);//使用double构造,丢失了部分精度
//或者
String str = "1.234567899999999";
BigDecimal num2 = new BigDecimal(str);
加减乘除
其加减乘除和 BigInteger 类相同,在此不再赘述。
但在运行除法 divide 方法,可能会因为 BigDecimal 保存的精度极高,而结果为无限循环小数,系统陷入死循环,进而抛出异常。
解决方法也很简单:在调用 divide方法时,使用 BigDecimal.ROUND_CEILING 使结果的精度和被除数一致。
BigDecimal num1 = new BigDecimal("1.23456");
BigDecimal num2 = new BigDecimal("0.7");
System.out.println(num1.divide(num2));//报错,陷入死循环
System.out.println(num1.divide(num2,BigDecimal.ROUND_CEILING));
//正常运行,输出结果1.76366,与被除数精度保持一致