Java内置工具类


一、java.util.Objects

方法

compare(T a, T b, Comparator<? super T> c)

按照自定义的比较器比较两个对象的大小。
两对象指向同一地址,相等返回0,
否则,按照自定义的比较器去比较。

  • 源码
public static <T> int compare(T a, T b, Comparator<? super T> c) {
    return (a == b) ? 0 :  c.compare(a, b);
}
  • 举例
//比较字符串长度
int res = Objects.compare("1234", "132", new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length() - o2.length();
    }
});
System.out.println(res);//1

equals(Object a, Object b)

比较两个对象是否相等。
两个对象指向同一地址直接返回true,
否则对a判空,然后调用a的equals方法。

  • 源码
public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

isNull(Object obj)

判空

  • 源码
public static boolean isNull(Object obj) {
    return obj == null;
}

nonNull(Object obj)

判断非空

  • 源码
public static boolean nonNull(Object obj) {
    return obj != null;
}

Objects中的方法非常简单,对判空、比较等常用语句进行了简单封装。

二、java.lang.Math

方法

该类提供了许多方法的重载,有double、int、long。

abs(double a)

计算绝对值

  • 源码
public static double abs(double a) {
    return (a <= 0.0D) ? 0.0D - a : a;
}
  • 举例
System.out.println(Math.abs(-1));//1

floor(double a)

向下取整

  • 举例
System.out.println(Math.floor(-1.5));//-2
System.out.println(Math.floor(1.5));//1

ceil(double a)

向上取整

  • 举例
System.out.println(Math.ceil(-1.5));//-1
System.out.println(Math.ceil(1.5));//2

round(double a)

四舍五入

  • 举例
System.out.println(Math.round(-1.6));//-2
System.out.println(Math.round(1.6));//2
System.out.println(Math.round(-1.4));//-1
System.out.println(Math.round(1.4));//1

max(double a, double b)

取两数最大

  • 源码
public static int max(int a, int b) {
    return (a >= b) ? a : b;
}

min(double a, double b)

取两数最小

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

pow(double a, double b)

a的b次方

  • 举例
System.out.println(Math.pow(2,4));//16.0

sqrt(double a)

a的平方根

  • 举例
System.out.println(Math.sqrt(4));//2.0

cbrt(double a)

a的立方根

System.out.println(Math.cbrt(8));//2.0

random()

返回一个随机的[0.0,1.0)的随机数

  • 举例
//返回[1-10]的随机数
System.out.println((int) (Math.random() * 10 + 1));

三、java.util.Arrays

方法

asList(T… a)

将数组中的元素转化成List。

  • 源码
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

注意:此时的ArrayList并不是java.util.List,而是Arrays的内部类java.util Arrays.ArrayList。
如果直接使用asList可以返回一个List对象,但是并不能使用List中的方法

public class Test {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1","2","3");
        list.add("5");//java.lang.UnsupportedOperationException
    }
}

可以将asList返回的List装进java.util.List中使用

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("1","2","3"));
        list.add("5");
    }
}

注意:使用asList,参数是基本数据类型的数组时,并不会将数组转化为基本数据类型的List,而是转换成基本数据类型数组的List,jvm会将基本数据类型数组看成一个引用数据类型,使用引用数据类型就不会这样

ArrayList<int[]> ints = new ArrayList<>(Arrays.asList(new int[]{1, 2, 3}));
ArrayList<Integer> integers = new ArrayList<>(Arrays.asList(new Integer[]{1, 2, 3}));

binarySearch(int[] a, intkey)

二分查找,返回指定元素的索引

copyOf(int[] original, int newLength)

将原数组复制到一个指定长度的新数组

  • 举例
int[] a = Arrays.copyOf(new int[]{1,2,3},8);
System.out.println(Arrays.toString(a));//[1, 2, 3, 0, 0, 0, 0, 0]

copyOfRange(int[] original, int from, int to)

将指定范围的数组元素复制到新数组

int[] b = Arrays.copyOfRange(new int[]{1,2,3},0,2);
System.out.println(Arrays.toString(b));//[1, 2]

equals(int[] a, int[] a2)

比较两个数组是否彼此对应相等

  • 举例
Arrays.equals(new int[]{1,2,3},new int[]{3,2,1});//false
Arrays.equals(new int[]{1,2,3},new int[]{1,2,3});//true

fill(int[] a, int val)

将val填充到a所有元素

int[] c = new int[5];
Arrays.fill(c,4);
System.out.println(Arrays.toString(c));//[4, 4, 4, 4, 4]

fill(int[] a, int fromIndex, int toIndex, int val)

将val填充到a指定范围的元素

int[] c = new int[5];
Arrays.fill(c,1,3,4);
System.out.println(Arrays.toString(c));//[0, 4, 4, 0, 0]

sort(int[] a)

升序排序

int[] d = {1,2,5,6,7,4};
Arrays.sort(d);
System.out.println(Arrays.toString(d));//[1, 2, 4, 5, 6, 7]

toString(int[] a)

字符串打印数组元素

四、java.lang.System

方法

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

从源数组的指定位置复制到目标数组的指定位置,并不会改变目标数组的长度

//原数组,起始位置,目标数组,起始位置,长度
int[] a = {1,2,0,0,0,6,7};
int[] b = {3,4,5};
System.arraycopy(b,0,a,2,3);
System.out.println(Arrays.toString(a));//[1, 2, 3, 4, 5, 6, 7]

currentTimeMillis()

获取当前时间的毫秒值

System.out.println(System.currentTimeMillis());//1631889387611

九、java.util.Collections

方法

addAll(Collection<? super T> c, T… elements)

将所有指定元素加入集合

List<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c");
System.out.println(list);//[a, b, c]

binarySearch(List<? extends Comparable<? super T>> list, T key)

二分查找集合中的元素

copy(List<? super T> dest, List<? extends T> src)

将集合复制到另一个集合中

reverse(List<?> list)

反转集合中的元素

List<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c");
Collections.reverse(list);
System.out.println(list);//[c, b, a]

shuffle(List<?> list)

打乱顺序

List<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c");
Collections.shuffle(list);
System.out.println(list);//[c, a, b]

sort(List list)

升序排序

List<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c");
Collections.shuffle(list);
Collections.sort(list);
System.out.println(list);//[a, b, c]

swap(List<?> list, int i, int j)

交换集合中两元素的位置

List<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c");
Collections.swap(list,1,2);
System.out.println(list);//[a, c, b]

总结

今天整理了下Java内置的工具类方法,其中Collections针对集合;Arrays针对数组;Objects是对对象的简单封装;Math是针对数学运算。