经过之前对于API的学习:JAVA基础 —— API
接下来的文章让我们来了解一下不同类下的方法,但是这些方法不要去背。
而是要去记一下类名和类作用,也可以在以后去查阅API帮助文档。
Math、System、Runtime和Object | JAVA基础 (常用API)—— Math、System、Runtime和Object |
BigInteger和BigDecimal | JAVa基础(常用API) —— BigInteger和BigDecimal |
正则表达式 | JAVA基础(常用API) —— 正则表达式 |
时间相关类 | JAVA基础(常用API) —— 时间相关类 |
包装类 | JAVA基础(常用API) —— 包装类 |
目录
一、Math
- 是一个帮助我们用于进行数学计算的工具类。
- 私有化构造方法,所有的方法都是静态的。
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) | 四舍五入 |
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 sqrt(double a ) | 返回a的平方根 |
public static double cbrt(double a ) | 返回a的立方根 |
public static double random() | 返回值为double的随机值,范围 [ 0.0 , 1.0 ) |
public class mathTest {
public static void main(String[] args) {
// abs
System.out.println(-88); // 88
// bug: int 取值范围: -2147483648 ~ 2147483647
// System.out.println(Math.abs(-2147483648)); // -2147483648
// -2147483648 没有正整数与之对应 所以abs出现bug
// ceil 进一法:向数轴正方向进一
// floor 去尾法:向数轴负方向进一
System.out.println(Math.ceil(12.34)); // 13.0
System.out.println(Math.ceil(-12.34)); // -12.0
System.out.println(Math.floor(12.34)); // 12.0
System.out.println(Math.floor(-12.34)); // -13.0
// round
System.out.println(Math.round(12.34)); // 12
System.out.println(Math.round(-12.34)); // -12
// max min
System.out.println(Math.max(20, 30)); // 30
System.out.println(Math.min(20, 30)); // 20
// pow
System.out.println(Math.pow(2, 3)); // 8.0
// 细节:
// 如果第二个参数为 0~1 之间小数 即为开根方
// 如果第二个参数为负数 即为分数
System.out.println(Math.pow(2, 0.5)); // 1.414
System.out.println(Math.pow(2, -1)); // 0.5
// sqrt cbrt
System.out.println(Math.sqrt(4)); // 2.0
System.out.println(Math.cbrt(8)); // 2.0
// random
System.out.println(Math.random());
}
}
二、System
System也是一个工具类,提供了一些与系统相关的方法。
方法名 | 说明 |
public static void exit(int status) | 终止当前运行的java虚拟机 |
public static long currentTimeMillis() | 返回当前系统的时间毫秒值形式(1秒=1000毫秒) |
public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) | 数据拷贝 |
public class systemTest {
public static void main(String[] args) {
// 方法的形参:
// 状态码:
// 0:表示当前虚拟机是正常停止
// 非0:表示当前虚拟机异常停止
// System.exit(0);
// System.out.println("看看我执行了吗"); // 空
long l = System.currentTimeMillis();
// 获取程序运行时间 比较不同方法效率
System.out.println(l); // 1677458648668 1677458657205
int[] arr1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] arr2 = new int[10];
System.arraycopy(arr1, 0, arr2, 0, 10);
// 1.如果数据源数组和目的地数组都是基本数据类型,那么两者类型必须一致
double[] arr3 = new double[10];
System.arraycopy(arr1, 0, arr3, 0, 10); // 报错
// 2.在拷贝时候要考虑数组的长度,如果超出范围也会报错
int[] arr4 = new int[5];
System.arraycopy(arr1, 0, arr4, 0, 10); // 报错
// 3.如果数据源数组和目的地质数都是引用数据类型,那么子类类型可以赋值给父类类型
Student stu1 = new Student("zhangsan", 23);
Student stu2 = new Student("lisi", 24);
Student stu3 = new Student("wangwu", 25);
Student[] arr5 = { stu1, stu2, stu3 };
Student[] arr6 = new Student[3];
System.arraycopy(arr5, 0, arr6, 0, 3); // zhangsan 23 lisi 24 wangwu 25
for (int i = 0; i < arr2.length; i++) {
System.err.print(arr2[i] + ",");
}
}
}
class Person {
private String name;
private int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
}
class Student extends Person {
public Student() {}
public Student(String name, int age) {super(name, age);}
}
三、Runtime
Runtime表示当前虚拟机的运行环境,但是Runtime不是静态的,调用方法要先获取其对象。
方法名 | 说明 |
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命令 |
import java.io.IOException;
public class RuntimeTest {
public static void main(String[] args) throws IOException {
// 获取Runtime对象
Runtime rt = Runtime.getRuntime();
// Runtime.getRuntime().exit(0);
// System.out.println("看看我执行了吗"); //空
// CPU线程数
System.out.println(Runtime.getRuntime().availableProcessors()); // 12
// 总内存大小
System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024); // 3414兆
// 已经获取的总内存大小
System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024); // 245兆
// 剩余内存大小
System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024); // 242兆
// 运行cmd命令
// shutdown :关机
// -s:默认一分钟之后关机
// -s -t 指定时间:指定关机时间
// -a:取消关机操作
// -r:关机并重启
Runtime.getRuntime().exec("notepad"); // 打开记事本
}
}
四、Object
- Object 是Java中的顶级父类。所有的类都直接或间接的继承于Object类。
- Object类中的方法可以被所有子类访问,所以我们要学习Object类和其中的方法。
- Objects是一个工具类,提空了一些方法完成一些功能。
Object的构造方法:
方法名 | 说明 |
public Object() | 空参构造 |
Object的成员方法:
方法名 | 说明 |
public String toString() | 返回对象的字符串表示形式 |
public boolean equals(Object obj) | 比较两个对象是否相等 |
protected Object clone(int a) | 对象克隆 |
1. toString方法
public class ObjectTest {
public static void main(String[] args) {
//返回对象字符串表现形式
Object obj = new Object();
String str1 = obj.toString();
System.out.println(str1);//java.lang.Object@7852e922
User u = new User();
String str2 = u.toString();
//细节:
//System:类名 ; out:静态变量
//System.out:获取打印对象 ; println():方法 ;参数:打印内容
//核心逻辑:
//当我们打印一个对象时,底层会调用对象的toString方法,把对象编程字符串
//然后再打印在控制台上,打印完毕换行处理
//默认情况下,因为Object类中的toString方法返回的是地址值
//所以默认情况下,打印一个对象打印的就是地址值
//如果我们想要看到内部属性值 就要重写父类Object的toString方法
System.out.println(u); //重写toString前:API.User@4e25154f
System.out.println(u); //重写toString后:User [name=null, age=0]
System.out.println(str2); //API.User@4e25154f
}
}
class User{
private String name;
private int age;
public User() {}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
2.euqals方法
public class ObjectTest {
public static void main(String[] args) {
//比较对象相等
User u1 = new User();
User u2 = new User();
System.out.println( u1.equals(u2)); //fasle
//重写equals后:
User u3 = new User("zhangsan",23);
User u4 = new User("zhangsan",23);
System.out.println( u3.equals(u4)); //true
//如果没有重写equals,那么默认使用Object中的方法进行比较,比较的是地址值是否相等
//一般来说地址值对我们没有意义,所以我们重写,重写后比较的就是对象内部的属性值
//面试题练习:
String s = "abc";
StringBuilder sb = new StringBuilder("abc");
System.out.println(s.equals(sb)); //false
//因为equals方法是被s调用的,而s是字符串
//所以equals要看String类中的
//字符串中equals方法先判断参数是否为字符串
//如果是则比较内部属性,如果表示则直接返回false
System.out.println(sb.equals(s)); //false
//因为equals方法先被sb调用,而sb是StringBuilder
//所以equals要看StringBuilder类中的
//在StringBuilder中没有重写equals方法
//使用object中的,在Object中默认使用 == 比较两对象地址值
}
}
class User{
private String name;
private int age;
public User() {}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
3. clone方法:
3.1 浅克隆
- 基本数据类型拷贝记录的数据值,引用数据类型直接拷贝变量记录的地址值。即不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来。
- 两个对象使用同一个数组,其中有一个对象对数组中数据发生改变,另外一个对象再次访问的就是已经被改变的数据。
3.2 深克隆
- 如果是基本数据类型,会将变量记录数据值直接拷贝过去,如果是字符串会直接复用,但如果是引用数据类型,则不会直接拷贝地址值,而是在外面再创建一个对象。
- 两个对象使用不同的数组,二者互不影响。