什么是API
API(application programming interface) 应用程序编程接口
简单来说:就是Java帮我们已经写好的一些类和方法,我们直接拿过来用就可以了
Objec类
Object类介绍
所有的类,都直接或者间接的继承了Object
类(祖宗类)
Object
类的方法是一切子类都可以直接使用的,所以我们要学习object类的方法。
Object类的常用方法
public String toString()
- 开发中直接输出对象,默认输出对象的地址其实是毫无意义的。
- 开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
一个现象
当我们打印对象名的时候,println()
源码中会自动调用对象的toString
方法。
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
public String toString()
return getClass().getName() + "@" + Integer.toHexString(hashcode();
}
解释
对象的全类名@十六进制哈希值
哈希值 = 对象的值+哈希算法,常被人称作地址值
结论
Object
类的toString
方法,就是让我们重写的
----重写了才有意义
今后打印某一个对象的名字,看到的不是地址值,就说明该类重写过toString
方法。
public boolean equals(Object obj)
比较两个对象是否相等
public boolean equals(Object obj) {
return (this == obj);
}
**结论:**这个方法也需要我们自己重写
@Override
//stu1.equals(stu2);
//this: stu1对象
//o: stu2对象
public boolean equals(Object o) {
//如果地址相同, 就没必要比较内容, 直接返回true.
if (this == o) return true;
//代码执行到这里, 说明stu1肯定不是null
//stu1不是null, stu2是null值, 就直接返回false.
//-------------------------------------------
//比较两个对象的字节码, 如果字节码不相同, 返回false.
if (o == null || getClass() != o.getClass()) return false;
//代码执行到这里, 说明类型肯定都是Student,向下转型
Student student = (Student) o;
//比较内容
return age == student.age && Objects.equals(name, student.name);
}
public static boolean equals(Object a, Object b)
让两个对象进行比较
- 这个方法, 内部依赖于我们自己重写的equals方法.
- 优势: 可以避免不必要的空指针异常.
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
a是null --> a != null --> false
&& 左边为false, 右边就不执行, a是null的状态, 不会调用equals方法.
a不是null --> a != null --> true
&& 左边为true, 右边继续执行, a不是null的状态, 才会调用到equals方法.
Math类
包含执行基本数字运算的方法
Math类的常用方法
System类
常用方法
BigDecimal类
创建对象
将需要运算的小数, 封装为BigDecimal对象
【强制】禁止使用构造方法 BigDecimal(double)
的方式把 double
值转化为 BigDecimal
对象。
说明:BigDecima(double)
存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。
A: 通过构造方法 `BigDecimal(String val)`
B: 通过静态方法 `valueOf ` `static BigDecimal valueOf(double val)`
四则运算
public BigDecimal add(BigDecimal augend)
: 加法
public BigDecimal subtract(BigDecimal subtrahend)
: 减法
public BigDecimal multiply(BigDecimal multiplicand)
: 乘法
public BigDecimal divide(BigDecimal divisor)
: 除法
BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
:
除法操作, 并指定保留小数点多少位, 还有舍入模式
舍入模式 :
RoundingMode.HALF_UP
四舍五入
RoundingMode.UP
进一法
RoundingMode.DOWN
去尾法
double doubleValue()
将此BigDecimal
转换为double
BigDecimal bd1 = BigDecimal.valueOf(10.0);
BigDecimal bd2 = BigDecimal.valueOf(3.0);
Double result1 = bd1.add(bd2).doubleValue();
Double result2 = bd1.subtract(bd2).doubleValue();
Double result3 = bd
1.multiply(bd2).doubleValue();
Double result4 = bd1.divide(bd2, 5, RoundingMode.HALF_DOWN).doubleValue();
System.out.println(result1); //13.0
System.out.println(result2); //7.0
System.out.println(result3); //30.0
System.out.println(result4); //3.33333
包装类
分类:
byte | Byte |
---|---|
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
如何进行包装
手动装箱: 手动的调用方法,将基本数据类型, 包装为类
Integer i = Integer.valueOf(10);
自动装箱(JDK5): 将基本数据类型, 直接赋值给包装类的变量.
- 内部会自动的调用
Integer
类的valueOf()
方法
手动拆箱: 手动的调用方法,将包装类(引用数据类型),转换为基本数据类型
int num = i.intValue();
自动拆箱(JDK5): 将包装类的对象, 直接赋值给基本数据类型变量
int num = i;
- 这句代码, 会自动的调用
intValue();
结论: 基本数据类型, 和对应的包装类是可以直接在一起运算的.
Integer i1 = 10;
int num = 20;
int result = i1 + num
System.out.println(result); //30
自动装箱的现象:
如果装箱的数据, 在byte
的取值范围内 (-128~127)
==
号比较的结果就是true
, 反之是false
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); //true
Integer i3 = 129;
Integer i4 = 129;
System.out.println(i3 == i4); //false
原因
Integer.valueOf();
Integer[] cache = {new Integer(-128), new Integer(-127)
.... new Integer(126), new Integer(127)};
public static Integer valueOf(int i) { // 126
if (i >= -128 && i <= 127) {
return IntegerCache.cache[i + 128]; // 254
}
return new Integer(i);
}
Integer
自动装箱的时候会调用valueOf
方法
方法的源码中, 会进行一个判断, 判断装箱的数据是否在 -128~127之间
在 : 会从底层的缓存中取出对象进行使用.
不在 : 会创建出一个新的对象
底层的缓存实际上是一个Integer
类型的数组, 名字叫做cache
, 内部存储了 -128~127 之间所有的Integer
对象.
如果装箱的数据在范围中, 就会从缓存中取出已有的对象使用, 避免创建太多重复的对象.
Integer常用方法
- 字符串必须是数字字符串
Arrays类
- 数组操作工具类,专门用于操作数组元素
public static void main(String[] args) {
int[] arr1 = {11, 22, 33, 44, 55};
int[] arr2 = {11, 22, 33, 44, 55};
// 按照指定的格式, 将数组元素拼接为字符串
System.out.println(Arrays.toString(arr1));
// 比较两个数组内容是否相同
System.out.println(Arrays.equals(arr1, arr2));
// 根据元素找索引
// 注意: binarySearch使用二分查找法找索引, 要求数组元素必须是有序的.
System.out.println(Arrays.binarySearch(arr1, 66));
int[] arr = {22, 11, 55, 33, 44};
System.out.println(Arrays.binarySearch(arr, 33));
// 对数组升序排序
// 问题: 降序如何操作?
// 回答: TODO 讲解了TreeSet集合之后, 再说这个问题.
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}