服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 深入了解Java核心类库--Objects类

深入了解Java核心类库--Objects类

2021-10-28 09:59入错行的北北 Java教程

这篇文章主要介绍了Java中的Object类详细介绍,本文讲解了Object类的作用、Object类的主要方法、Object类中不能被重写的方法、Object类的equals方法重写实例等内容,需要的朋友可以参考下

1 Objects

1.1 Objects方法

工具类,常用于检查操作

返回值 方法名 作用
static int checkFromIndexSize​(int fromIndex, int size, int length) 检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。
static int checkFromToIndex​(int fromIndex, int toIndex, int length) 检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内
static int checkIndex​(int index, int length) 检查子范围index是否在 [0,length)范围界限内
static int compare(T a, T b, Comparator<? super T> c) 如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果
static boolean deepEquals(Object a, Object b) 对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数)
static boolean equals(Object a, Object b) 对比a,b参数是否相等
static int hash(Object… values) 为输入值序列生成哈希码
static int hashCode(Object o) 非空返回哈希码,null则抛出NullPointerException
static boolean isNull(Object obj) obj参数为null返回true
static boolean nonNull(Object obj) obj参数不为null返回true
static T requireNonNull(T obj) 检查指定的对象引用不是 null,为null则抛出NullPointerException
static T requireNonNull(T obj, String message) 检查指定的对象引用不是null,否则抛出自定义的NullPointerException
static T requireNonNull​(T obj, Supplier messageSupplier) 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static T requireNonNullElse​(T obj, T defaultObj) 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。
static T requireNonNullElseGet​(T obj, Supplier<? extends T> supplier) 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。
static String toString(Object o) 返回对象的字符串表示形式
static String toString(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源码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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()

  • Object类是基类,是所有类的父类(基类)
  • 如果一个类没有明确的继承某一个具体的类,则将默认继承Object类

例如我们定义一个类:

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

  • object的多态:使用Object可以接收任意的引用数据类型

例:

?
1
2
3
4
5
6
7
8
9
10
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 int checkFromIndexSize​(int fromIndex, int size, int length) 检查子范围[ fromIndex ,fromIndex + size)是否在 [0,length)范围界限内。
static int checkFromToIndex​(int fromIndex, int toIndex, int length) 检查子范围[ fromIndex ,toIndex)是否在 [0,length)范围界限内
static int checkIndex​(int index, int length) 检查子范围index是否在 [0,length)范围界限内
static int compare(T a, T b, Comparator<? super T> c) 如果参数a,b相同则返回0,否则返回c.compare(a, b)的结果
static boolean deepEquals(Object a, Object b) 对比a,b参数是否深层次相等(如果a,b为数组,则对比数组的每个参数)
static boolean equals(Object a, Object b) 对比a,b参数是否相等
static int hash(Object… values) 为输入值序列生成哈希码
static int hashCode(Object o) 非空返回哈希码,null则抛出NullPointerException
static boolean isNull(Object obj) obj参数为null返回true
static boolean nonNull(Object obj) obj参数不为null返回true
static T requireNonNull(T obj) 检查指定的对象引用不是 null,为null则抛出NullPointerException
static T requireNonNull(T obj, String message) 检查指定的对象引用不是null,否则抛出自定义的NullPointerException
static T requireNonNull​(T obj, Supplier messageSupplier) 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static T requireNonNullElse​(T obj, T defaultObj) 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。
static T requireNonNullElseGet​(T obj, Supplier<? extends T> supplier) 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。
static String toString(Object o) 返回对象的字符串表示形式
static String toString(Object o, String nullDefault) 如果第一个参数不是 null ,则返回第一个参数调用 toString的结果,否则返回第二个参数

2.2.1 equals(Object obj)

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

  • equals方法在非null对象引用上实现等价关系
  • 等于
    • 对于任何非空引用值x和y,当且仅当x和y引用同一对象( x == y具有值true )时,此方法返回true
  • ==比的是内存地址
  • 请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码。
?
1
2
3
4
5
6
7
8
9
10
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()))

?
1
2
3
4
5
6
7
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

  • 建议重写Object中的toString方法

2.3 Object源码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 { }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/m0_50609545/article/details/117792334

延伸 · 阅读

精彩推荐
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30