天天看点

JAVA 常用类库总结(1)

写在前面

要想成为一个优秀的Java工程师,会看源码是不可或缺的必备技能。在IDEA里,Ctrl+鼠标左键就可以看到类的源码。同样的,也要熟悉Java的API文档。这里简单的介绍一些Java类库及其常用的方法,会根据我自己的学习进度进行不定时更新。

java.util.Objects

我们知道 java.lang.Object 是类层次的根,所有类的基类,即所有类都继承自Object。这里我们介绍的是 java.util.Objects 类。

此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括null或null方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。

  1. 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方法,就不会出现空指针异常了。

  1. 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);
    }
           
  1. Objects.isNull(Object obj)

    空则返回true,不空返回false。源码为

public static boolean isNull(Object obj) {
       return obj == null;
  	}
           
  1. Objects.nonNull(Object obj)

    不空则返回true,空返回false。源码为

public static boolean nonNull(Object obj) {
        return obj != null;
    }
           
  1. Objects.requireNonNull​(T obj)

    如果传参为空,直接抛出异常。当我们需要判断传过来的对象必须不能为空时,可以使用这个方法,调用方法的程序如果不处理异常,程序就会中断。源码为

public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }
           

java.lang.Math

类Math包含用于执行基本数字运算的方法,例如基本指数,对数,平方根和三角函数。

  1. public static double abs​(int a)

    该方法为求绝对值,重载了int,float,double,long等基本数据类型。

  2. public static double min​(int a, int b)

    该方法返回两数种较小的一个,同样有重载方法。

  3. public static int min​(int a, int b)

    该方法返回两数种较大的一个,同样有重载方法。

  4. public static long round​(double a)

    该方法返回四舍五入后的值,1.5结果为2,-1.5四舍五入后为-1。

  5. public static double floor​(double a)

    返回小于或等于参数且等于数学整数的最大值,1.5结果为1,-1.5结果为-2

  6. public static double ceil​(double a)

    返回大于或等于参数且等于数学整数的最小值,1.2结果为2,-1.2结果为-1

java.util.Arrays

该类包含用于操作数组的各种方法(例如排序和搜索)。 此类还包含一个静态工厂,允许将数组视为列表。

  1. static int binarySearch​(int[] a, int fromIndex, int toIndex, int key)

    使用二进制搜索算法搜索指定值的指定数组的范围,有重载。

  2. static int binarySearch​(int[] a, int key)

    使用二进制搜索算法在指定的int数组中搜索指定的值,有重载。

  3. static int compare​(boolean[] a, boolean[] b)

    boolean字典顺序比较两个 boolean阵列。

  4. static void sort​(Object[] a)

    根据元素的natural ordering ,将指定的对象数组按升序排序。

  5. static void sort​(Object[] a, int fromIndex, int toIndex)

    根据元素的natural ordering ,将指定对象数组的指定范围按升序排序。

  6. static String toString​(double[] a)

    返回指定数组内容的字符串表示形式。

  7. static int mismatch​(double[] a, double[] b)

    查找并返回两个 double数组之间第一个不匹配的索引,否则如果未找到不匹配则返回-1。

  8. static boolean equals​(int[] a, int[] a2)

    如果两个指定的int数组彼此 相等 ,则返回 true 。

  9. 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 常用类库总结(1)

在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()

    运行垃圾回收器。