Java常用API
- 什么是API?
- Object类的作用:
- Object类的常用方法:
- Object的toString方法:
- Obiect的equals方法
- Obiects
- StringBuilder
- Math
- System类概述
- BigDecimal
什么是API?
1.API应用程序编程接口。
2.简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来就可以了。
Object类的作用:
1.一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
2.Obiect类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法。
Object类的常用方法:
Object的toString方法:
问题引出:
1.开发中直接输出对象,默认输出对象的地址其实是毫无意义的。
2.开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
toString存在的意义
父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!
Obiect的equals方法
直接比较两个对象的地址是否相同完全可以用“==”代替equals。
equals存在的意义:父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则。
Obiects
Obiects类与Object还是继承关系,Objects类从JDK1.7开始之后才有的。
官方在进行字符串比较时,没有对象自己的equals方法,而是选择了Objects的equals方法来比较两个对象。
Objects的equals方法比较的结果是一样的,但是更安全。
Objects的常见方法:
package snow.d10_api_Objects;
import java.util.Objects;
public class Test {
public static void main(String[] args) {
String s1 = "snow";
String s2 = "snow";
// System.out.println(s1.equals(s2)); // String类型中从写的equals方法会发生空指针异常
System.out.println(Objects.equals(s1, s2));
// 源码分析
/**
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
*/
}
}
StringBuilder
StringBuilder是一个可变的字符串类,我们可以把它看成一个对象容器。
StringBuilder作用:提高字符串的操作效率,如拼接、修改等。
StringBuilder构造器:
StringBuilder常用方法:
拼接验证:
package snow.d11_api_stringbuilder;
public class StringBuilderDemo1 {
public static void main(String[] args) {
StringBuilder s = new StringBuilder();
s.append('a');
s.append(1);
s.append(false);
s.append(3.3);
s.append("abc");
System.out.println(s);
StringBuilder s1 = new StringBuilder();
// 支持链式编程
s1.append("a").append("b").append("snow");
System.out.println(s1);
// 反转
s1.reverse().append("123");
System.out.println(s1);
// 获取长度
System.out.println(s1.length());
// StringBuilder只是拼接字符串的手段,效率好
// 最终的目的还是要恢复成String类型
StringBuilder s2 = new StringBuilder();
s2.append("123").append("456");
// 恢复成String类型
String rs = s2.toString();
}
}
String类拼接字符串原理图
首先把main方法加载到栈内存,然后执行main方法中的第一条语句,a进入字符串常量池,然后b也进入常量池,然后把s1拼接起来时,需要在堆内存中实例化一个StringBuilder对象,然后把a和b拼接到StringBuilder对象中,然后通过toString方法把“ab”转为String类型,然后赋值给s2.
然后c进常量池,在用S2拼接c的时候,同样需要在堆内存中实例化一个StringBuilder对象,然后把ab与c拼接后的abc放入对象中,然后同样经过toString方法转化为String类型,然后赋值给s3,然后输出拼接的对象。
一个加号,堆内存中两个对象。
StringBuilder提高效率原理图
首先main方法和clss文件加载到方法区,然后把main方法提取到栈内存中,然后在堆内存中实例化一次对象,然后依次把a,b,c放入字符串常量池然后,最后产生StringBuilder类型的拼接结果。
案例:打印整型数组内容
需求:设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:“该数组内容为:[11,22,33,44,55]”
分析:1.定义一个方法,要求该方法能够接收数组,并输出数组内容。
2.定义一个静态初始化的数组,调用该方法,并传入该数组。
package snow.d11_api_stringbuilder;
public class StringBuilderDemo2 {
public static void main(String[] args) {
int[] arr1 = null;
System.out.println(toString(arr1));
int[] arr2 = {11,22,33,44};
System.out.println(toString(arr2));
}
// 定义方法接受任意整形数组,返回数组内容格式
public static String toString(int [] arr){
if (arr != null){
// 开始拼接内容
StringBuilder s = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
s.append(arr[i]).append(i == arr.length-1 ? "":",");
}
s.append("]");
return s.toString();
}else {
return null;
}
}
}
Math
包含执行基本数字运算的方法,Math类没有提供公开的构造器。
如何使用类中的成员呢?看类的成员是否都是静态的,如果是,通过类名就可以直接调用。
Math类的常用方法
package snow.d12_math;
public class MathDemo {
public static void main(String[] args) {
// 获取绝对值
System.out.println(Math.abs(-10)); // 10
System.out.println(Math.abs(-10.3)); // 10.3
// 向上取整
System.out.println(Math.ceil(4.3)); // 5.0
// 向下取整
System.out.println(Math.floor(4.9)); // 4.0
// 求指数次方
System.out.println(Math.pow(2, 3)); //2^3 = 8.0
// 四舍五入
System.out.println(Math.round(4.4)); // 4
System.out.println(Math.round(4.5)); // 5
// 随机数0.0 - 1.0
System.out.println(Math.random());
}
}
System类概述
System的功能是通用的,都是直接用类名调用即可,所以System不能被实例化。
System类的常用方法
时间毫秒值
计算机认为时间是有起点的,起始时间:1970年1月1日 00:00:00
时间毫秒值:指的是从1970年1月1日 00:00:00走到此刻总的毫秒数,应该是很大的,1s=1000ms。
// 计算机认为时间有起源,1970-1-1 00:00:00 走到此刻的总毫秒值,时间毫秒值
long time = System.currentTimeMillis();
System.out.println(time);
数组拷贝:
/**数组拷贝
*arraycopy(Object src, int srcPos,
* Object dest, int destPos,int length);
* 参数一:被拷贝的数组
* 参数二:从哪个位置开始拷贝
* 参数三:复制目标数组
* 参数四:粘贴位置
* 参数五:拷贝元素的个数
*/
int[] arr = {10,20,30,40};
int[] arr2 = new int[4]; // [0,0,0,0,0,0]==>[10,20,30,40]
System.arraycopy(arr,0,arr2,0,2);
System.out.println(Arrays.toString(arr2));
BigDecimal
BigDecimal作用
用于解决浮点型运算精度失真的问题
使用步骤
创建对象BigDecimal封装浮点型数据 (最好的方式是调用方法)
public static BigDecimal valueof(double val): 包装浮点数成为BigDecimal对象。
BigDecima常用API
package snow.d14_bigdecimal;
import java.math.BigDecimal;
public class BigDecimalDemo {
public static void main(String[] args) {
// 浮点型运算的时候直接+ =/ 可能会出现数据失真(精度问题)
System.out.println(0.09 + 0.01); //0.09999999999999999
System.out.println(1.0 - 0.32); //0.6799999999999999
System.out.println(1.015 * 100); //101.49999999999999
System.out.println(1.301 / 100); //0.013009999999999999
System.out.println("----------------");
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c); // 0.30000000000000004
System.out.println("----------------");
// 包装浮点型数据成为大数据对象BigDeciaml
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
BigDecimal c1 = a1.add(b1);
System.out.println(c1); // 0.3
// 目的:double
double rs = c1.doubleValue();
System.out.println(rs); // 0.3
// 注意事项:BigDecimal是一定要精度运算的
BigDecimal a11 = BigDecimal.valueOf(10.0);
BigDecimal b11 = BigDecimal.valueOf(3.0);
/**
* 参数一:除数
* 参数二:保留小数位
* 参数三:舍入模式
*/
BigDecimal c11 = a11.divide(b11,2, RoundingMode.HALF_UP); // 3.33333
System.out.println(c11); // 3.33
}
}