一、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) // 按照四舍五入返回最接近参数的int类型的值
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 random() // 返回一个[0.0,1.0)的随机值
二、System类
public static long currentTimeMillis() // 获取当前时间所对应的毫秒值(当前时间为0时区所对应的时间即就是英国格林尼治天文台旧址所在位置)
public static void exit(int status) // 终止当前正在运行的Java虚拟机,0表示正常退出,非零表示异常退出
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);// 进行数值元素copy
// src: 源数组
// srcPos: 源数值的开始位置
// dest: 目标数组
// destPos: 目标数组开始位置
// length: 要复制的元素个数
三、Runtime
Runtime表示Java中运行时对象,可以获取到程序运行时设计到的一些信息
常见方法如下所示:
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命令
例:
//1.获取Runtime的对象
//Runtime r1 =Runtime.getRuntime();
//2.exit 停止虚拟机
//Runtime.getRuntime().exit(0);
//System.out.println("看看我执行了吗?");
//3.获得CPU的线程数
System.out.println(Runtime.getRuntime().availableProcessors());//8
//4.总内存大小,单位byte字节
System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);//4064
//5.已经获取的总内存大小,单位byte字节
System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);//254
//6.剩余内存大小
System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);//251
//7.运行cmd命令
//shutdown :关机
//加上参数才能执行
//-s :默认在1分钟之后关机
//-s -t 指定时间 : 指定关机时间
//-a :取消关机操作
//-r: 关机并重启
Runtime.getRuntime().exec("shutdown -s -t 3600");//一小时后关机
四、Object类
Object类所在包是java.lang包。Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类;换句话说,该类所具备的方法,其他所有类都继承了。
一般情况下我们很少去主动的创建Object类的对象,调用其对应的方法。更多的是创建Object类的某个子类对象,然后通过子类对象调用Object类中的方法。
常见方法如下:
public String toString() //返回该对象的字符串表示形式(可以看做是对象的内存地址值)
public boolean equals(Object obj) //比较两个对象地址值是否相等;true表示相同,false表示不相同
protected Object clone() //对象克隆
toString() :
Object类中toString方法获取的是对象的内存地址值,没有太大的意义,获取对象的成员变量的字符串拼接形式才算有意义。此时我们就需要在Javabean类中重写Object的toString方法,如
@Override
public String toString() {
return name + ", " + age;
}
小结:
1. 在通过输出语句输出一个对象时,默认调用的就是toString()方法
2. 输出地址值一般没有意义,我们可以通过重写toString方法去输出对应的成员变量信息(快捷键:atl + insert , 空白处 右键 -> Generate -> 选择toString)
3. toString方法的作用:以良好的格式,更方便的展示对象中的属性值
4. 一般情况下Jdk所提供的类都会重写Object类中的toString方法
equals:
默认情况下equals方法比较的也是对象的地址值。比较内存地址值一般情况下是没有意义的,我们希望比较的是对象的属性,如果两个对象的属性相同,我们认为就是同一个对象;
那么要比较对象的属性,我们就需要在JavaBean类中重写Object类中的equals方法.
具体的操作如下所示:
1. 在空白处使用快捷键:alt + insert。此时会弹出如下的对话框
![1576056718392](assets/1576056718392.png)
2. 选择equals() and hashCode()方法,此时会弹出如下的对话框
![1576057779458](assets/1576057779458.png)
点击next,会弹出如下对话框:
![1576057813175](assets/1576057813175.png)
选择neme和age属性点击next,此时就会弹出如下对话框:
![1576057892814](assets/1576057892814.png)
取消name和age属性(因为此时选择的是在生成hashCode方法时所涉及到的属性,关于hashCode方法后期再做重点介绍),点击Finish完成生成操作。生成的equals方法和hashCode方法如下:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(name, student.name) && Objects.equals(age, student.age); // 比较的是对象的name属性值和age属性值
}
@Override
public int hashCode() {
return 0;
}
此时equals方法比较的是对象的成员变量值.
小结:
1. 默认情况下equals方法比较的是对象的地址值
2. 比较对象的地址值是没有意义的,因此一般情况下我们都会重写Object类中的equals方法
color:对象克隆
对象克隆的分类:深克隆和浅克隆
浅克隆(默认):
不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
基本数据类型拷贝过来的是具体的数据,引用数据类型拷贝过来的是地址值。
Object类默认的是浅克隆,如果需要深克隆需要重写方法或者使用第三方工具类。
深克隆:
基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的
细节:
方法在底层会帮我们创建一个对象,并把原对象中的数据拷贝过去。
书写细节:
1.重写Object中的clone方法
2.让javabean类实现Cloneable接口
3.创建原对象并调用clone就可以了
以后一般会用第三方工具进行克隆:
1.第三方写的代码导入到项目中
2.编写代码
Gson gson =new Gson();
把对象变成一个字符串
String s=gson.toJson(u1);
再把字符串变回对象就可以了
User user =gson.fromJson(s, User.class);
int[] arr=u1.getData();
arr[0] = 100;
打印对象
System.out.println(user);
五、Objects
Objects类所在包是在java.util包下,因此在使用的时候需要进行导包。并且Objects类是被final修饰的,因此该类不能被继承。
常见方法:
public static String toString(Object o) // 获取对象的字符串表现形式
public static boolean equals(Object a, Object b) // 比较两个对象是否相等
public static boolean isNull(Object obj) // 判断对象是否为null
public static boolean nonNull(Object obj) // 判断对象是否不为null
equal细节:
1.方法的底层会判断s1是否为null,如果为null,直接返回false
2.如果s1不为null,那么就利用s1再次调用equals方法
3.此时s1是student类型,所以最终还是会调用student中的equals方法。
如果没有重写,比较地址值,如果重写了,就比较属性值。
六、BigInteger类
平时在存储整数的时候,Java中默认是int类型,int类型有取值范围:-2147483648 ~ 2147483647。如果数字过大,
就需要用到BigInteger,可以理解为:大的整数。
有多大呢?理论上最大到42亿的21亿次方,基本上在内存撑爆之前,都无法达到这个上限。
常见方法:
public BigInteger(int num, Random rnd) //获取随机大整数,范围:[0 ~ 2的num次方-1]
public BigInteger(String val) //获取指定的大整数
public BigInteger(String val, int radix) //获取指定进制的大整数
下面这个不是构造,而是一个静态方法获取BigInteger对象
public static BigInteger valueOf(long val) //静态方法获取BigInteger的对象,内部有优化
BigInteger.valueOf细节:
1.能表示范围比较小,只能在long的取值范围之内,如果超出long的范围就不行了。
2.在内部对常用的数字: -16 ~ 16 进行了优化。
提前把-16~16 先创建好BigInteger的对象,如果多次获取不会重新创建新的。
小结:
* 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
* 如果BigInteger表示的超出long的范围,可以用构造方法获取。
* 对象一旦创建,BigInteger内部记录的值不能发生改变。
* 只要进行计算都会产生一个新的BigInteger对象
public BigInteger add(BigInteger val) 加法
public BigInteger subtract(BigInteger val) 减法
public BigInteger multiply(BigInteger val) 乘法
public BigInteger divide(BigInteger val) 除法,获取商
public BigInteger[] divideAndRemainder(BigInteger val) 除法,获取商和余数
public boolean equals(Object x) 比较是否相同
public BigInteger pow(int exponent) 次幂
public BigInteger max/min(BigInteger val) 返回较大值/较小值
public int intValue(BigInteger val) 转为int类型整数,超出范围数据有误
底层存储方式:
实际存储的时候,先把具体的数字变成二进制,每32个bit为一组,存储在数组中。
理论上,BigInteger能表示的最大数字为:42亿的21亿次方。
但是还没到这个数字,电脑的内存就会撑爆,所以一般认为BigInteger是无限的。
七、BigDecimal类
在使用float或者double类型的数据在进行数学运算的时候,很有可能会产生精度丢失问题。
1.通过传递double类型的小数来创建对象//细节;
这种方式有可能是不精确的,所以不建议使用
2.通过传递字符串表示的小数来创建对象
BigDecimal bd3 = new BigDecimal( val: "e.e1");
BigDecimal bd4 = new BigDecimal( val: "e.09" ) ;
system.out.print1n(bd3);
system.out.println( bd4);
3.通过静态方法获取对象
BigDecimal bd6 = BigDecimal.valueof(10);
system.out.print1n( bd6);
细节:
1.如果要表示的数字不大,没有超出double的取值范围,建议使用静态方法
2.如果要表示的数字比较大,超出了double的取值范围,建议使用构造方法
3.如果我们传递的是e~10之间的整数,包含e,包含10,那么方法会返回已经创建好的对象,不会重新new
常见成员方法:
public BigDecimal add(BigDecimal value) // 加法运算
public BigDecimal subtract(BigDecimal value) // 减法运算
public BigDecimal multiply(BigDecimal value) // 乘法运算
public BigDecimal divide(BigDecimal value) // 除法运算BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)//(除数,精确几位,舍入模式)
//除法运算
divisor: 除数对应的BigDecimal对象;
scale: 精确的位数;
roundingMode: 取入模式;
取舍模式被封装到了RoundingMode这个枚举类中(关于枚举我们后期再做重点讲解),在这个枚举类中定义了很多种取入方式。最常见的取舍方式有如下几个:
UP(直接进1) ,UP:远离零方向舍入的舍入模式DOWN:向零方向舍入的舍入模式
CEILING:向正无限大方向舍入的舍入模式FLOOR(直接删除) ,
HALF_UP(4舍五入),我们可以通过如下格式直接访问这些取舍模式:枚举类名.变量名
底层存储方式:
把数据看成字符串,遍历得到里面的每一个字符,把这些字符在ASCII码表上的值,都存储到数组中。
附:API帮助文档