要想成为一个优秀的Java工程师,会看源码是不可或缺的必备技能。在IDEA里,Ctrl+鼠标左键就可以看到类的源码。同样的,也要熟悉Java的API文档。这里简单的介绍一些Java类库及其常用的方法,会根据我自己的学习进度进行不定时更新。
我们知道 java.lang.Object 是类层次的根,所有类的基类,即所有类都继承自Object。这里我们介绍的是 java.util.Objects 类。 此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括null或null方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。
Objects.equals equals(Object a, Object b) 如果参数相等,返回true;其他则返回false。 因此,如果这两个参数是null , 返回true,如果只有一个参数为null,返回false。如果二者都不为空,通过使用第一个参数的equals方法确定相等性。这样写当然没有问题,但是考虑传参时,有可能传过来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; }类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结果为-2public static double ceil(double a) 返回大于或等于参数且等于数学整数的最小值,1.2结果为2,-1.2结果为-1该类包含用于操作数组的各种方法(例如排序和搜索)。 此类还包含一个静态工厂,允许将数组视为列表。
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);在写一些简单的程序的时候,你是否会有这样的疑问。
System.out.println(0.1+0.2);输出结果毫无疑问应当是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 等方法,返回基本数据类型。对于这个类我们并不陌生,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() 运行垃圾回收器。