写在前面
要想成为一个优秀的Java工程师,会看源码是不可或缺的必备技能。在IDEA里,Ctrl+鼠标左键就可以看到类的源码。同样的,也要熟悉Java的API文档。这里简单的介绍一些Java类库及其常用的方法,会根据我自己的学习进度进行不定时更新。
java.util.Objects
我们知道 java.lang.Object 是类层次的根,所有类的基类,即所有类都继承自Object。这里我们介绍的是 java.util.Objects 类。
此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括null或null方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。
-
Objects.equals
equals(Object a, Object b) 如果参数相等,返回true;其他则返回false。 因此,如果这两个参数是null , 返回true,如果只有一个参数为null,返回false。如果二者都不为空,通过使用第一个参数的equals方法确定相等性。
观察下面的代码
String s1 = "123";
String s2 = "456";
System.out.println(s1.equals(s2));
这样写当然没有问题,但是考虑传参时,有可能传过来null,即
String s1 = null;
String s2 = "456";
System.out.println(s1.equals(s2));
这样会产生空指针异常,因为一个空的null不能调取方法。如果使用Objects类的方法,就不会产生异常。
String s1 = null;
String s2 = "456";
System.out.println(Objects.equals(p1, p2));
我们来看Objects类equals方法的源码。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
a == b 比较的是两个对象的内存地址,如果内存地址相同,即同一个对象,返回true;(a != null && a.equals(b) 这段代码是先判断a不为空,a不为空后再调用基类Object的equals方法,就不会出现空指针异常了。
-
Objects.checkFromIndexSize(int fromIndex, int size, int length)
检查是否在子范围从 fromIndex (包括)到 fromIndex + size (不包括)是范围界限内 0 (包括)到 length(不包括)。( java里常用包括上界,不包括下界的区间)源码为
public static
int checkFromIndexSize(int fromIndex, int size, int length) {
return Preconditions.checkFromIndexSize(fromIndex, size, length, null);
}
-
Objects.isNull(Object obj)
空则返回true,不空返回false。源码为
public static boolean isNull(Object obj) {
return obj == null;
}
-
Objects.nonNull(Object obj)
不空则返回true,空返回false。源码为
public static boolean nonNull(Object obj) {
return obj != null;
}
-
Objects.requireNonNull(T obj)
如果传参为空,直接抛出异常。当我们需要判断传过来的对象必须不能为空时,可以使用这个方法,调用方法的程序如果不处理异常,程序就会中断。源码为
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
java.lang.Math
类Math包含用于执行基本数字运算的方法,例如基本指数,对数,平方根和三角函数。
-
public static double abs(int a)
该方法为求绝对值,重载了int,float,double,long等基本数据类型。
-
public static double min(int a, int b)
该方法返回两数种较小的一个,同样有重载方法。
-
public static int min(int a, int b)
该方法返回两数种较大的一个,同样有重载方法。
-
public static long round(double a)
该方法返回四舍五入后的值,1.5结果为2,-1.5四舍五入后为-1。
-
public static double floor(double a)
返回小于或等于参数且等于数学整数的最大值,1.5结果为1,-1.5结果为-2
-
public static double ceil(double a)
返回大于或等于参数且等于数学整数的最小值,1.2结果为2,-1.2结果为-1
java.util.Arrays
该类包含用于操作数组的各种方法(例如排序和搜索)。 此类还包含一个静态工厂,允许将数组视为列表。
-
static int binarySearch(int[] a, int fromIndex, int toIndex, int key)
使用二进制搜索算法搜索指定值的指定数组的范围,有重载。
-
static int binarySearch(int[] a, int key)
使用二进制搜索算法在指定的int数组中搜索指定的值,有重载。
-
static int compare(boolean[] a, boolean[] b)
boolean字典顺序比较两个 boolean阵列。
-
static void sort(Object[] a)
根据元素的natural ordering ,将指定的对象数组按升序排序。
-
static void sort(Object[] a, int fromIndex, int toIndex)
根据元素的natural ordering ,将指定对象数组的指定范围按升序排序。
-
static String toString(double[] a)
返回指定数组内容的字符串表示形式。
-
static int mismatch(double[] a, double[] b)
查找并返回两个 double数组之间第一个不匹配的索引,否则如果未找到不匹配则返回-1。
-
static boolean equals(int[] a, int[] a2)
如果两个指定的int数组彼此 相等 ,则返回 true 。
-
static double[] copyOf(double[] original, int newLength)
实现数组的动态扩容,传入原数组和新长度,即可扩容。如下代码块,数组长度已经更改为15。
int arr[] = {1,2,3,4,5};
arr = Arrays.copyOf(arr, 15);
arr[6] = 1;
System.out.println(arr.length);
java.math.BigDecimal
在写一些简单的程序的时候,你是否会有这样的疑问。
输出结果毫无疑问应当是0.3,但是其实是…
在java中,如果使用double float等基本数据类型进行运算时,运算的结果会失去一些精准。当我们想做一个金融方面的程序时,这样小的误差积累起来会导致结果错误。BigDecimal类可以解决小数误差问题。来看一下这个类的使用方法吧。
public class Demo1 {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
BigDecimal b3 = b1.add(b2);
System.out.println(b3);
}
}
需要注意以下几点
- 创建对象时传入的时字符串类型
- add subtract multiply divide分别表示加减乘除方法,这些方法返回的也是一个BigDecimal对象,参与运算的对象不会发生变化
- 可以使用 intValue doubleValue 等方法,返回基本数据类型。
java.lang.System
对于这个类我们并不陌生,System类提供的方法包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。
- static PrintStream err “标准”错误输出流。
- static InputStream in “标准”输入流。
- static PrintStream out “标准”输出流。
-
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。
-
static void gc()
运行垃圾回收器。