Java中如何使用Objects类

发布时间:2021-07-29 17:43:28 作者:Leah
来源:亿速云 阅读:207

Java中如何使用Objects类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1 Objects

1.1 Objects方法

工具类,常用于检查操作

返回值方法名作用
static intcheckFromIndexSize(int fromIndex, int size, int length)检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。
static intcheckFromToIndex(int fromIndex, int toIndex, int length)检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内
static intcheckIndex(int index, int length)检查子范围index是否在 [0,length)范围界限内
static intcompare(T a, T b, Comparator<? super T> c)如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果
static booleandeepEquals(Object a, Object b)对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数)
static booleanequals(Object a, Object b)对比a,b参数是否相等
static inthash(Object… values)为输入值序列生成哈希码
static inthashCode(Object o)非空返回哈希码,null则抛出NullPointerException
static booleanisNull(Object obj)obj参数为null返回true
static booleannonNull(Object obj)obj参数不为null返回true
static TrequireNonNull(T obj)检查指定的对象引用不是 null,为null则抛出NullPointerException
static TrequireNonNull(T obj, String message)检查指定的对象引用不是null,否则抛出自定义的NullPointerException
static TrequireNonNull(T obj, Supplier messageSupplier)检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static TrequireNonNullElse(T obj, T defaultObj)如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。
static TrequireNonNullElseGet(T obj, Supplier<? extends T> supplier)如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。
static StringtoString(Object o)返回对象的字符串表示形式
static StringtoString(Object o, String nullDefault)如果第一个参数不是 null ,则返回第一个参数调用 toString的结果,否则返回第二个参数

1.2 Objects常用方法

1.2.1 equals(Object a, Object b)

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

1.2.2 isNull(Object obj)

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

1.2.3 nonNull(Object obj)

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

1.2.4 requireNonNull(T obj)

requireNonNull(T obj)源码:
public static T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}

1.3 Objects源码

package java.util;
import jdk.internal.util.Preconditions;
import jdk.internal.vm.annotation.ForceInline;
import java.util.function.Supplier;
public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
    public static boolean deepEquals(Object a, Object b) {
        if (a == b)
            return true;
        else if (a == null || b == null)
            return false;
        else
            return Arrays.deepEquals0(a, b);
    }
    public static int hashCode(Object o) {
        return o != null ? o.hashCode() : 0;
    }
    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }
    public static String toString(Object o) {
        return String.valueOf(o);
    }
    public static String toString(Object o, String nullDefault) {
        return (o != null) ? o.toString() : nullDefault;
    }
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
        return (a == b) ? 0 :  c.compare(a, b);
    }
    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }
    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }
    public static boolean isNull(Object obj) {
        return obj == null;
    }
    public static boolean nonNull(Object obj) {
        return obj != null;
    }
    public static <T> T requireNonNullElse(T obj, T defaultObj) {
        return (obj != null) ? obj : requireNonNull(defaultObj, "defaultObj");
    }
    public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) {
        return (obj != null) ? obj
                : requireNonNull(requireNonNull(supplier, "supplier").get(), "supplier.get()");
    }
    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
        if (obj == null)
            throw new NullPointerException(messageSupplier == null ?
                                           null : messageSupplier.get());
        return obj;
    }
    @ForceInline
    public static
    int checkIndex(int index, int length) {
        return Preconditions.checkIndex(index, length, null);
    }
    public static int checkFromToIndex(int fromIndex, int toIndex, int length) {
        return Preconditions.checkFromToIndex(fromIndex, toIndex, length, null);
    }
    public static int checkFromIndexSize(int fromIndex, int size, int length) {
        return Preconditions.checkFromIndexSize(fromIndex, size, length, null);
    }
}

2 区别于Object

2.1 Object构造方法

public Object()

例如我们定义一个类:

public class Person{
}
其实它被使用时 是这样的:
public class Person extends Object{
}

例:

public static void main(String[] args){
	String text = "123";
	say(text);
	int a = 10;
	say(a);
	say("123");
}
public static void say(Object o){//多态的体现
	System.out.println(o);
}

2.2 Object其他方法

返回值方法名作用
static intcheckFromIndexSize(int fromIndex, int size, int length)检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。
static intcheckFromToIndex(int fromIndex, int toIndex, int length)检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内
static intcheckIndex(int index, int length)检查子范围index是否在 [0,length)范围界限内
static intcompare(T a, T b, Comparator<? super T> c)如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果
static booleandeepEquals(Object a, Object b)对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数)
static booleanequals(Object a, Object b)对比a,b参数是否相等
static inthash(Object… values)为输入值序列生成哈希码
static inthashCode(Object o)非空返回哈希码,null则抛出NullPointerException
static booleanisNull(Object obj)obj参数为null返回true
static booleannonNull(Object obj)obj参数不为null返回true
static TrequireNonNull(T obj)检查指定的对象引用不是 null,为null则抛出NullPointerException
static TrequireNonNull(T obj, String message)检查指定的对象引用不是null,否则抛出自定义的NullPointerException
static TrequireNonNull(T obj, Supplier messageSupplier)检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static TrequireNonNullElse(T obj, T defaultObj)如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。
static TrequireNonNullElseGet(T obj, Supplier<? extends T> supplier)如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。
static StringtoString(Object o)返回对象的字符串表示形式
static StringtoString(Object o, String nullDefault)如果第一个参数不是 null ,则返回第一个参数调用 toString的结果,否则返回第二个参数
2.2.1 equals(Object obj)

equals(Object obj)源码:
public boolean equals(Object obj) {
return (this == obj);
}

public static void main(String[] args) {
        Person p = new Person(1234,"张三");
        Person e = new Person(2345,"李四");
        System.out.println("p:"+p.hashCode());//p:1239731077
        System.out.println("e:"+e.hashCode());//e:357863579
        System.out.println(p.equals(e));//false
        e=p;//此时指向相同的内存地址
        System.out.println("e:"+e.hashCode());//e:1239731077
        System.out.println(p.equals(e));//true
}

输出结果:
p:1239731077
e:357863579
false
e:1239731077
true

equals方法重写时的五个特性:

自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
对称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)返回true 。
传递性 :对于任何非空引用值x ,y和z ,如果x.equals(y)回报true并且y.equals(z)返回true,x.equals(z)应该返回true 。
一致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,前提是未修改对象上的equals比较中使用的信息。
非空性 :对于任何非空的参考值x , x.equals(null)应该返回false 。

2.2.2 toString()

toString()源码
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}

默认为字符串,通常返回一个“文本表示”此对象的字符串,返回对象的内存地址(对象实例的类名称@对象的哈希码的无符号十六进制,即:getClass().getName() + ‘@' + Integer.toHexString(hashCode()))

public static void main(String[] args) {
        Person p = new Person(1234,"张三");
        Person e = new Person(2345,"李四");
        System.out.println("e.getClass():"+e.getClass());
        System.out.println("e.hashCode():"+e.hashCode());
        System.out.println("e.toString():"+e.toString());
}

输出结果:
e.getClass():class com.company.demo.Person
e.hashCode():114132791
e.toString():com.company.demo.Person@6cd8737

2.3 Object源码

package java.lang;
import jdk.internal.HotSpotIntrinsicCandidate;
public class Object {
    private static native void registerNatives();
    static {
        registerNatives();
    }
    @HotSpotIntrinsicCandidate
    public Object() {}
    @HotSpotIntrinsicCandidate
    public final native Class<?> getClass();
    @HotSpotIntrinsicCandidate
    public native int hashCode();
    public boolean equals(Object obj) {
        return (this == obj);
    }
    @HotSpotIntrinsicCandidate
    protected native Object clone() throws CloneNotSupportedException;
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    @HotSpotIntrinsicCandidate
    public final native void notify();
    @HotSpotIntrinsicCandidate
    public final native void notifyAll();
    public final void wait() throws InterruptedException {
        wait(0L);
    }
    public final native void wait(long timeoutMillis) throws InterruptedException;
    public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
        if (timeoutMillis < 0) {
            throw new IllegalArgumentException("timeoutMillis value is negative");
        }
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
        if (nanos > 0) {
            timeoutMillis++;
        }
        wait(timeoutMillis);
    }
    protected void finalize() throws Throwable { }
}

看完上述内容,你们掌握Java中如何使用Objects类的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. java中的类是什么?怎么使用类?
  2. java中ReentrantLock类如何使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java objects

上一篇:Java中怎么实现动态日历效果

下一篇:VScode中如何使用fortran

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》