小白学java——Objects类的方法总结

Objects    14种方法

用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围

范围检查 (返回int)

1.Objects.checkFromIndexSize(int fromIndex,int  size,int  length)

int a = Objects.checkFromIndexSize(4, 8, 12);

System.out.println(a);

结果为:4

int a = Objects.checkFromIndexSize(4, 8, 11);

System.out.println(a);

结果为:Range [4, 4 + 8) out of bounds for length 11

检查是否在子范围从 fromIndex (包括)到 fromIndex + size (不包括)是范围界限内 0 (包括)到 length (不包括)。

 

2.Objects.checkFromToIndex​(int fromIndex, int toIndex, int length)

检查是否在子范围从 fromIndex (包括)到 toIndex (不包括)是范围界限内 0 (包括)到 length (不包括)。

 

3.Objects.checkIndex​(int index, int length)

检查 index是否在 0 (含)到 length (不包括)范围内。

 

 

两个对象作比较

1.public static <T> int compare(T a, T b, Comparator<? super T> c)

此方法用于比较a,b两个对象如果a,b两个对象指向同一引用地址,返回0;否则调用c的compare方法进行比较,c的compare方法中传入的两个参数就分别是a,b。 源代码:

public static <T> int compare(T a, T b, Comparator<? super T> c) {
    return (a == b) ? 0 :  c.compare(a, b);
}

测试代码:

public class Demo1 implements Comparator<Demo1> {
    private String data;
    public Demo1() {
    }
    public Demo1(String data) {
        this.data = data;
    }
    public static void main(String[] args) {
        Demo1 test1 = new Demo1("测试代码Test1");
        Demo1 test2 = new Demo1("测试代码Test2");
        Demo1 test3 = new Demo1("测试代码Test1");
        int a = Objects.compare(test1, test1, new Demo1());
        System.out.println(a);
        int b = Objects.compare(test1, test3, new Demo1());
        System.out.println(b);
        int c = Objects.compare(test1, test2, new Demo1());
        System.out.println(c);
    }
    @Override
    public int compare(Demo1 o1, Demo1 o2) {
        if (o1.data == o2.data)
            return 1;
        return 2;
    }
}
输出:0  1  2

 

2.public static boolean deepEquals(Object a, Object b)

此方法用于比较a,b两个对象是否深度相等,为什么要叫深度相等?因为a,b两个对象都可以为数组。由于Java中Object类是一切类的基类,所以Object o = new Object[10]的代码是被允许的。所以传入的对象可以是一个数组。如果传入的对象是数组,要比较两个对象是否深度相等,就要比较两个数组对应下标的元素是否都相等。如果传入的对象有一个不是数组,就直接调用a对象的equals方法传入b对象比较两对象是否相等。 下面我们来看下源码:

public static boolean deepEquals(Object a, Object b) {
    //如果a和b指向同一地址,则a和b是同一对象,返回true。
    if (a == b)
        return true;
    //如果a或b中有一对象为空,则a和b不是同一类型对象,返回false。这样也避免了当a为空或者b为空时调用equals方法造成的空指针引用异常。
    else if (a == null || b == null)
        return false;
    //否则,调用Arrays类的deepEquals0方法对a,b进行深度比较。
    else
        return Arrays.deepEquals0(a, b);
}

我们跳到Arrays类的deepEquals0方法进行分析,虽然有很多的判断语句,但是逻辑基本相同,我们就分析其中几个:

static boolean deepEquals0(Object e1, Object e2) {
    //因为之后要调用e1的equals方法,所以e1不能为空。
    assert e1 != null;
    //定义返回值。
    boolean eq;
    //这个if是用于判断引用数据类型数组的,如果e1,e2都是引用数据类型数组的话,就调用Arrays类的deepEquals方法判断两数组是否相等。之后的基本数据类型的判断流程也一样。
    if (e1 instanceof Object[] && e2 instanceof Object[])
        eq = deepEquals ((Object[]) e1, (Object[]) e2);
    else if (e1 instanceof byte[] && e2 instanceof byte[])
        eq = equals((byte[]) e1, (byte[]) e2);
    else if (e1 instanceof short[] && e2 instanceof short[])
        eq = equals((short[]) e1, (short[]) e2);
    else if (e1 instanceof int[] && e2 instanceof int[])
        eq = equals((int[]) e1, (int[]) e2);
    else if (e1 instanceof long[] && e2 instanceof long[])
        eq = equals((long[]) e1, (long[]) e2);
    else if (e1 instanceof char[] && e2 instanceof char[])
        eq = equals((char[]) e1, (char[]) e2);
    else if (e1 instanceof float[] && e2 instanceof float[])
        eq = equals((float[]) e1, (float[]) e2);
    else if (e1 instanceof double[] && e2 instanceof double[])
        eq = equals((double[]) e1, (double[]) e2);
    else if (e1 instanceof boolean[] && e2 instanceof boolean[])
        eq = equals((boolean[]) e1, (boolean[]) e2);
    //如果e1和e2不全为数组,就调用e1的equals方法。
    else
        eq = e1.equals(e2);
    //返回判断的结果。
    return eq;
}

 

 

3.public static boolean equals(Object a, Object b) {

        return (a == b) || (a != null && a.equals(b));

    }

返回 true如果参数相等,彼此 false其他,相比于对象直接调用equals避免了空指针异常的现象

 

 

判断传入参数是否为空

1.public static boolean isNull(Object obj) {

        return obj == null;

    }

返回 true则是null ,否则返回 false   对象创建时有了引用地址就不为空,除非给它赋值NULL

 

 

2.public static boolean nonNull(Object obj) {

        return obj != null;

    }

返回 true则是非空, null返回 false 

 

 

3.public static <T> T requireNonNull(T obj) {

    if (obj == null)

        throw new NullPointerException();

    return obj;

}

检查指定的对象引用是否为 null ,是则抛出异常

 

 

4.public static <T> T requireNonNull(T obj, String message) {

        if (obj == null)

            throw new NullPointerException(message);

        return obj;

}

检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException

 

5.public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {

        if (obj == null)

            throw new NullPointerException(messageSupplier == null ?

                                           null : messageSupplier.get());

        return obj;

}

检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException

 

 

6.public static <T> T requireNonNullElse(T obj, T defaultObj) {

    return (obj != null) ? obj : requireNonNull(defaultObj, "defaultObj");

}

如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数

 

 

直接返回调用的结果toString

1.public static String toString(Object o) {

        return String.valueOf(o);

}

返回调用的结果 toString对于非 null参数输出哈系数(Person@2d363fb3), "null"则直接输出null

public static String valueOf(Object obj) {

        return (obj == null) ? "null" : obj.toString();

}

 

 

2.public static String toString(Object o, String nullDefault) {

        return (o != null) ? o.toString() : nullDefault;

}

如果第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数

上一篇:zabbix监控mysql的设定过程


下一篇:用Objects类的静态方法判断对象是否为空