深入了解Java核心類庫(kù)--Objects類
1 Objects
1.1 Objects方法
工具類,常用于檢查操作
| 返回值 | 方法名 | 作用 |
|---|---|---|
| static int | checkFromIndexSize(int fromIndex, int size, int length) | 檢查子范圍[ fromIndex ,fromIndex + size)是否在 [0,length)范圍界限內(nèi)。 |
| static int | checkFromToIndex(int fromIndex, int toIndex, int length) | 檢查子范圍[ fromIndex ,toIndex)是否在 [0,length)范圍界限內(nèi) |
| static int | checkIndex(int index, int length) | 檢查子范圍index是否在 [0,length)范圍界限內(nèi) |
| static int | compare(T a, T b, Comparator<? super T> c) | 如果參數(shù)a,b相同則返回0,否則返回c.compare(a, b)的結(jié)果 |
| static boolean | deepEquals(Object a, Object b) | 對(duì)比a,b參數(shù)是否深層次相等(如果a,b為數(shù)組,則對(duì)比數(shù)組的每個(gè)參數(shù)) |
| static boolean | equals(Object a, Object b) | 對(duì)比a,b參數(shù)是否相等 |
| static int | hash(Object… values) | 為輸入值序列生成哈希碼 |
| static int | hashCode(Object o) | 非空返回哈希碼,null則拋出NullPointerException |
| static boolean | isNull(Object obj) | obj參數(shù)為null返回true |
| static boolean | nonNull(Object obj) | obj參數(shù)不為null返回true |
| static T | requireNonNull(T obj) | 檢查指定的對(duì)象引用不是 null,為null則拋出NullPointerException |
| static T | requireNonNull(T obj, String message) | 檢查指定的對(duì)象引用不是null,否則拋出自定義的NullPointerException |
| static T | requireNonNull(T obj, Supplier messageSupplier) | 檢查指定的對(duì)象引用是否為null ,如果是,則拋出自定義的NullPointerException 。 |
| static T | requireNonNullElse(T obj, T defaultObj) | 如果它是非 null ,則返回第一個(gè)參數(shù),否則返回非 null第二個(gè)參數(shù)。 |
| static T | requireNonNullElseGet(T obj, Supplier<? extends T> supplier) | 如果它是非 null ,則返回第一個(gè)參數(shù),否則返回非 null值 supplier.get() 。 |
| static String | toString(Object o) | 返回對(duì)象的字符串表示形式 |
| static String | toString(Object o, String nullDefault) | 如果第一個(gè)參數(shù)不是 null ,則返回第一個(gè)參數(shù)調(diào)用 toString的結(jié)果,否則返回第二個(gè)參數(shù) |
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 區(qū)別于Object
2.1 Object構(gòu)造方法
public Object()
- Object類是基類,是所有類的父類(基類)
- 如果一個(gè)類沒(méi)有明確的繼承某一個(gè)具體的類,則將默認(rèn)繼承Object類
例如我們定義一個(gè)類:
public class Person{
}
其實(shí)它被使用時(shí) 是這樣的:
public class Person extends Object{
}
- object的多態(tài):使用Object可以接收任意的引用數(shù)據(jù)類型
例:
public static void main(String[] args){
String text = "123";
say(text);
int a = 10;
say(a);
say("123");
}
public static void say(Object o){//多態(tài)的體現(xiàn)
System.out.println(o);
}
2.2 Object其他方法
| 返回值 | 方法名 | 作用 |
|---|---|---|
| static int | checkFromIndexSize(int fromIndex, int size, int length) | 檢查子范圍[ fromIndex ,fromIndex + size)是否在 [0,length)范圍界限內(nèi)。 |
| static int | checkFromToIndex(int fromIndex, int toIndex, int length) | 檢查子范圍[ fromIndex ,toIndex)是否在 [0,length)范圍界限內(nèi) |
| static int | checkIndex(int index, int length) | 檢查子范圍index是否在 [0,length)范圍界限內(nèi) |
| static int | compare(T a, T b, Comparator<? super T> c) | 如果參數(shù)a,b相同則返回0,否則返回c.compare(a, b)的結(jié)果 |
| static boolean | deepEquals(Object a, Object b) | 對(duì)比a,b參數(shù)是否深層次相等(如果a,b為數(shù)組,則對(duì)比數(shù)組的每個(gè)參數(shù)) |
| static boolean | equals(Object a, Object b) | 對(duì)比a,b參數(shù)是否相等 |
| static int | hash(Object… values) | 為輸入值序列生成哈希碼 |
| static int | hashCode(Object o) | 非空返回哈希碼,null則拋出NullPointerException |
| static boolean | isNull(Object obj) | obj參數(shù)為null返回true |
| static boolean | nonNull(Object obj) | obj參數(shù)不為null返回true |
| static T | requireNonNull(T obj) | 檢查指定的對(duì)象引用不是 null,為null則拋出NullPointerException |
| static T | requireNonNull(T obj, String message) | 檢查指定的對(duì)象引用不是null,否則拋出自定義的NullPointerException |
| static T | requireNonNull(T obj, Supplier messageSupplier) | 檢查指定的對(duì)象引用是否為null ,如果是,則拋出自定義的NullPointerException 。 |
| static T | requireNonNullElse(T obj, T defaultObj) | 如果它是非 null ,則返回第一個(gè)參數(shù),否則返回非 null第二個(gè)參數(shù)。 |
| static T | requireNonNullElseGet(T obj, Supplier<? extends T> supplier) | 如果它是非 null ,則返回第一個(gè)參數(shù),否則返回非 null值 supplier.get() 。 |
| static String | toString(Object o) | 返回對(duì)象的字符串表示形式 |
| static String | toString(Object o, String nullDefault) | 如果第一個(gè)參數(shù)不是 null ,則返回第一個(gè)參數(shù)調(diào)用 toString的結(jié)果,否則返回第二個(gè)參數(shù) |
2.2.1 equals(Object obj)
equals(Object obj)源碼:
public boolean equals(Object obj) {
return (this == obj);
}
- equals方法在非null對(duì)象引用上實(shí)現(xiàn)等價(jià)關(guān)系
- 等于
- 對(duì)于任何非空引用值x和y,當(dāng)且僅當(dāng)x和y引用同一對(duì)象( x == y具有值true )時(shí),此方法返回true
- ==比的是內(nèi)存地址
- 請(qǐng)注意,通常需要在重寫此方法時(shí)覆蓋hashCode方法,以便維護(hù)hashCode方法的常規(guī)協(xié)定,該方法聲明相等對(duì)象必須具有相等的哈希代碼。
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;//此時(shí)指向相同的內(nèi)存地址
System.out.println("e:"+e.hashCode());//e:1239731077
System.out.println(p.equals(e));//true
}
輸出結(jié)果:
p:1239731077
e:357863579
false
e:1239731077
true
equals方法重寫時(shí)的五個(gè)特性:
自反性 :對(duì)于任何非空的參考值x , x.equals(x)應(yīng)該返回true 。
對(duì)稱性 :對(duì)于任何非空引用值x和y , x.equals(y)應(yīng)該返回true當(dāng)且僅當(dāng)y.equals(x)返回true 。
傳遞性 :對(duì)于任何非空引用值x ,y和z ,如果x.equals(y)回報(bào)true并且y.equals(z)返回true,x.equals(z)應(yīng)該返回true 。
一致性 :對(duì)于任何非空引用值x和y ,多次調(diào)用x.equals(y)始終返回true或始終返回false ,前提是未修改對(duì)象上的equals比較中使用的信息。
非空性 :對(duì)于任何非空的參考值x , x.equals(null)應(yīng)該返回false 。
2.2.2 toString()
toString()源碼
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
默認(rèn)為字符串,通常返回一個(gè)“文本表示”此對(duì)象的字符串,返回對(duì)象的內(nèi)存地址(對(duì)象實(shí)例的類名稱@對(duì)象的哈希碼的無(wú)符號(hào)十六進(jìn)制,即: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());
}
輸出結(jié)果:
e.getClass():class com.company.demo.Person
e.hashCode():114132791
e.toString():com.company.demo.Person@6cd8737
- 建議重寫Object中的toString方法
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 { }
}
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java服務(wù)限流算法的6種實(shí)現(xiàn)
服務(wù)限流是指通過(guò)控制請(qǐng)求的速率或次數(shù)來(lái)達(dá)到保護(hù)服務(wù)的目的,本文主要介紹了Java服務(wù)限流算法的6種實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05
Spring中BeanFactory?FactoryBean和ObjectFactory的三種的區(qū)別
關(guān)于FactoryBean?和?BeanFactory的對(duì)比文章比較多,但是對(duì)ObjectFactory的描述就比較少,今天我們對(duì)比下這三種的區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-01-01
Java輸入輸出流復(fù)制文件所用時(shí)間對(duì)比
這篇文章主要介紹了Java輸入輸出流復(fù)制文件所用時(shí)間對(duì)比的相關(guān)資料,非常不錯(cuò),具有參考解決價(jià)值,需要的朋友可以參考下2016-08-08
Java布隆過(guò)濾器的原理和實(shí)現(xiàn)分析
數(shù)組、鏈表、樹等數(shù)據(jù)結(jié)構(gòu)會(huì)存儲(chǔ)元素的內(nèi)容,一旦數(shù)據(jù)量過(guò)大,消耗的內(nèi)存也會(huì)呈現(xiàn)線性增長(zhǎng)所以布隆過(guò)濾器是為了解決數(shù)據(jù)量大的一種數(shù)據(jù)結(jié)構(gòu)。本文就來(lái)和大家詳細(xì)說(shuō)說(shuō)布隆過(guò)濾器的原理和實(shí)現(xiàn),感興趣的可以了解一下2022-10-10
springboot接收J(rèn)SON實(shí)現(xiàn)示例解析
這篇文章主要為大家介紹了springboot如何接收J(rèn)SON的實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
如何用Java的swing編寫簡(jiǎn)單計(jì)算器
這篇文章主要給大家介紹了關(guān)于如何用Java的swing編寫簡(jiǎn)單計(jì)算器的相關(guān)資料,通過(guò)本文可以設(shè)計(jì)一個(gè)圖形界面的簡(jiǎn)易計(jì)算器,完成簡(jiǎn)單的算術(shù)運(yùn)算符,可以完成加法、減法、乘法、除法和取余運(yùn)算,需要的朋友可以參考下2023-12-12
SpringBoot實(shí)現(xiàn)Tomcat集群的會(huì)話管理功能
在使用 Tomcat 集群時(shí),由于每個(gè) Tomcat 實(shí)例的 Session 存儲(chǔ)是獨(dú)立的,導(dǎo)致無(wú)法實(shí)現(xiàn) Session 的共享,這可能影響到用戶跨節(jié)點(diǎn)的訪問(wèn),為了實(shí)現(xiàn)跨 Tomcat 實(shí)例共享 Session,可以使用 Spring Session 配合 Redis 進(jìn)行集中式會(huì)話管理,需要的朋友可以參考下2024-12-12
break和continue的作用和區(qū)別解析(案例分析)
break和continue都是用來(lái)控制循環(huán)結(jié)構(gòu)的,主要作用是停止循環(huán),這篇文章主要介紹了break和continue的作用和區(qū)別,需要的朋友可以參考下2023-03-03
基于Spring p標(biāo)簽和c標(biāo)簽注入方式
這篇文章主要介紹了Spring p標(biāo)簽和c標(biāo)簽注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

