JAVA中幾個常用的方法

????類Object是類層次結構的根類,每一個類都使用Object作為超類,所有對象(包括數組)都實現這個類的方法。jdk1.5中,描述了該類中的11個方法

1.getClass

public final Class<? extends Object> getClass()
返回一個對象的運行時類。該?Class?對象是由所表示類的?static synchronized?方法鎖定的對象。

?

返回:
表示該對象的運行時類的?java.lang.Class?對象。此結果屬于類型?Class<? extends X>,其中 X 表示清除表達式中的靜態類型,該表達式調用?getClass

?

2.hashCode

public int hashCode()
返回該對象的哈希碼值。支持該方法是為哈希表提供一些優點,例如,java.util.Hashtable?提供的哈希表。

hashCode?的常規協定是:

  • 在 Java 應用程序執行期間,在同一對象上多次調用?hashCode?方法時,必須一致地返回相同的整數,前提是對象上?equals?比較中所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。
  • 如果根據?equals(Object)?方法,兩個對象是相等的,那么在兩個對象中的每個對象上調用?hashCode?方法都必須生成相同的整數結果。
  • 以下情況?是必需的:如果根據?equals(java.lang.Object)?方法,兩個對象不相等,那么在兩個對象中的任一對象上調用?hashCode?方法必定會生成不同的整數結果。但是,程序員應該知道,為不相等的對象生成不同整數結果可以提高哈希表的性能。

實際上,由?Object?類定義的 hashCode 方法確實會針對不同的對象返回不同的整數。(這一般是通過將該對象的內部地址轉換成一個整數來實現的,但是 JavaTM?編程語言不需要這種實現技巧。)

?

返回:
此對象的一個哈希碼值。

3.equals

public boolean equals(Object?obj)
指示某個其他對象是否與此對象“相等”。

equals?方法在非空對象引用上實現相等關系:

  • 自反性:對于任何非空引用值?xx.equals(x)?都應返回?true
  • 對稱性:對于任何非空引用值?x?和?y,當且僅當?y.equals(x)?返回?true?時,x.equals(y)?才應返回?true
  • 傳遞性:對于任何非空引用值?xy?和?z,如果?x.equals(y)?返回?true,并且?y.equals(z)?返回?true,那么?x.equals(z)?應返回?true
  • 一致性:對于任何非空引用值?x?和?y,多次調用?x.equals(y)?始終返回?true?或始終返回?false,前提是對象上?equals?比較中所用的信息沒有被修改。
  • 對于任何非空引用值?xx.equals(null)?都應返回?false

Object?類的?equals?方法實現對象上差別可能性最大的相等關系;即,對于任何非空引用值?x?和?y,當且僅當?x?和?y?引用同一個對象時,此方法才返回?truex == y?具有值true)。

注意:當此方法被重寫時,通常有必要重寫?hashCode?方法,以維護?hashCode?方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。

?

參數:
obj?- 要與之比較的引用對象。
返回:
如果此對象與 obj 參數相同,則返回?true;否則返回?false

4.clone

protected Object clone()
throws CloneNotSupportedException
創建并返回此對象的一個副本。“副本”的準確含義可能依賴于對象的類。一般來說,對于任何對象?x,如果表達式:
x.clone() != x
是正確的,則表達式:
x.clone().getClass() == x.getClass()
將為?true,但這些不是絕對條件。一般情況下是:
x.clone().equals(x)
將為?true,但這不是絕對條件。

按照慣例,返回的對象應該通過調用?super.clone?獲得。如果一個類及其所有的超類(Object?除外)都遵守此約定,則?x.clone().getClass() == x.getClass()

按照慣例,此方法返回的對象應該獨立于該對象(正被克隆的對象)。要獲得此獨立性,在?super.clone?返回對象之前,有必要對該對象的一個或多個字段進行修改。這通常意味著要復制包含正在被克隆對象的內部“深層結構”的所有可變對象,并使用對副本的引用替換對這些對象的引用。如果一個類只包含基本字段或對不變對象的引用,那么通常不需要修改?super.clone?返回的對象中的字段。

Object?類的?clone?方法執行特定的克隆操作。首先,如果此對象的類不能實現接口?Cloneable,則會拋出?CloneNotSupportedException。注意:所有的數組都被視為實現接口Cloneable。否則,此方法會創建此對象的類的一個新實例,并像通過分配那樣,嚴格使用此對象相應字段的內容初始化該對象的所有字段;這些字段的內容沒有被自我克隆。所以,此方法執行的是該對象的“淺表復制”,而不“深層復制”操作。

Object?類本身不實現接口?Cloneable,所以在類為?Object?的對象上調用?clone?方法將會導致在運行時拋出異常。

?

返回:
此實例的一個克隆。
拋出:
CloneNotSupportedException?- 如果對象的類不支持?Cloneable?接口,則重寫?clone?方法的子類也會拋出此異常,以指示無法克隆某個實例。

5.toString

public String toString()
返回該對象的字符串表示。通常,toString?方法會返回一個“以文本方式表示”此對象的字符串。結果應是一個簡明但易于讀懂。建議所有子類都重寫此方法。

Object?類的?toString?方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符“@”和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

?

返回:
該對象的字符串表示形式。

6.notify

public final void notify()
喚醒在此對象監視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的,并在對實現做出決定時發生。線程通過調用其中一個wait?方法,在對象的監視器上等待。

直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競爭;例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。

此方法只應由作為此對象監視器的所有者的線程來調用。通過以下三種方法之一,線程可以成為此對象監視器的所有者:

  • 通過執行此對象的同步 (Sychronized) 實例方法。
  • 通過執行在此對象上進行同步的?synchronized?語句的正文。
  • 對于?Class?類型的對象,可以通過執行該類的同步靜態方法。

一次只能有一個線程擁有對象的監視器。

?

拋出:
IllegalMonitorStateException?- 如果當前的線程不是此對象監視器的所有者。

7.notifyAll

public final void notifyAll()
喚醒在此對象監視器上等待的所有線程。線程通過調用其中一個?wait?方法,在對象的監視器上等待。

直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競爭;例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。

此方法只應由作為此對象監視器的所有者的線程來調用。請參閱?notify?方法,了解線程能夠成為監視器所有者的方法的描述。

?

拋出:
IllegalMonitorStateException?- 如果當前的線程不是此對象監視器的所有者。

8.finalize

protected void finalize()
throws Throwable
當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。子類重寫?finalize?方法,以配置系統資源或執行其他清除。

finalize?的常規協定是:當 JavaTM?虛擬機已確定尚未終止的任何線程無法再通過任何方法訪問此對象時,將調用此方法,除非由于準備終止的其他某個對象或類的終結操作執行了某個操作。finalize?方法可以采取任何操作,其中包括再次使此對象對其他線程可用;不過,finalize?的主要目的是在不可撤消地丟棄對象之前執行清除操作。例如,表示輸入/輸出連接的對象的 finalize 方法可執行顯式 I/O 事務,以便在永久丟棄對象之前中斷連接。

Object?類的?finalize?方法執行非特殊性操作;它僅執行一些常規返回。Object?的子類可以重寫此定義。

Java 編程語言不保證哪個線程將調用某個給定對象的?finalize?方法。但可以保證在調用 finalize 時,調用 finalize 的線程將不會持有任何用戶可見的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那么該異常將被忽略,并且該對象的終結操作將終止。

在啟用某個對象的?finalize?方法后,將不會執行進一步操作,直到 Java 虛擬機再次確定尚未終止的任何線程無法再通過任何方法訪問此對象,其中包括由準備終止的其他對象或類執行的可能操作,在執行該操作時,對象可能被丟棄。

對于任何給定對象,Java 虛擬機最多只調用一次?finalize?方法。

finalize?方法拋出的任何異常都會導致此對象的終結操作停止,但可以通過其他方法忽略它。

?

拋出:
Throwable?- 此方法拋出的?Exception

9.wait

public final void wait(long?timeout)
throws InterruptedException
導致當前的線程等待,直到其他線程調用此對象的?notify()?方法或?notifyAll()?方法,或者超過指定的時間量。

當前的線程必須擁有此對象監視器。

此方法導致當前線程(稱之為?T)將其自身放置在對象的等待集中,然后放棄此對象上的所有同步要求。出于線程調度目的,線程?T?被禁用,且處于休眠狀態,直到發生以下四種情況之一:

  • 其他某個線程調用此對象的?notify?方法,并且線程?T?碰巧被任選為被喚醒的線程。
  • 其他某個線程調用此對象的?notifyAll?方法。
  • 其他某個線程中斷線程?T
  • 已經到達指定的實際時間。但是,如果?timeout?為零,則不考慮實際時間,該線程將一直等待,直到獲得通知。
然后,從對象的等待集中刪除線程?T,并重新進行線程調度。然后,該線程以常規方式與其他線程競爭,以獲得在該對象上同步的權利;一旦獲得對該對象的控制權,該對象上的所有其同步聲明都將被還原到以前的狀態 - 這就是調用?wait?方法時的情況。然后,線程?T?從?wait?方法的調用中返回。所以,從?wait?方法返回時,該對象和線程?T?的同步狀態與調用?wait?方法時的情況完全相同。

在沒有被通知、中斷或超時的情況下,線程還可以喚醒一個所謂的虛假喚醒?(spurious wakeup)。雖然這種情況在實踐中很少發生,但是應用程序必須通過以下方式防止其發生,即對應該導致該線程被提醒的條件進行測試,如果不滿足該條件,則繼續等待。換句話說,等待應總是發生在循環中,如下面的示例:

synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
(有關這一主題的更多信息,請參閱 Doug Lea 撰寫的《Concurrent Programming in Java (Second Edition)》(Addison-Wesley, 2000) 中的第 3.2.3 節或 Joshua Bloch 撰寫的《Effective Java Programming Language Guide》(Addison-Wesley, 2001) 中的第 50 項。

如果當前線程在等待時被其他線程中斷,則會拋出?InterruptedException。在按上述形式恢復此對象的鎖定狀態時才會拋出此異常。

注意,由于?wait?方法將當前的線程放入了對象的等待集中,所以它只能解除此對象的鎖定;可以同步當前線程的任何其他對象在線程等待時仍處于鎖定狀態。

此方法只應由作為此對象監視器的所有者的線程來調用。請參閱?notify?方法,了解線程能夠成為監視器所有者的方法的描述。

?

參數:
timeout?- 要等待的最長時間(以毫秒為單位)。
拋出:
IllegalArgumentException?- 如果超時值為負。
IllegalMonitorStateException?- 如果當前的線程不是此對象監視器的所有者。
InterruptedException?- 如果在當前線程等待通知之前或者正在等待通知時,另一個線程中斷了當前線程。在拋出此異常時,當前線程的中斷狀態?被清除。

10.wait

public final void wait(long?timeout,
int?nanos)
throws InterruptedException
導致當前的線程等待,直到其他線程調用此對象的?notify()?方法或?notifyAll()?方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量。

此方法類似于一個參數的?wait?方法,但它允許更好地控制在放棄之前等待通知的時間量。用毫微秒度量的實際時間量可以通過以下公式計算出來:

1000000*timeout+nanos

在其他所有方面,此方法執行的操作與帶有一個參數的?wait(long)?方法相同。需要特別指出的是,wait(0, 0)?與?wait(0)?相同。

當前的線程必須擁有此對象監視器。該線程發布對此監視器的所有權,并等待下面兩個條件之一發生:

  • 其他線程通過調用?notify?方法,或?notifyAll?方法通知在此對象的監視器上等待的線程醒來。
  • timeout?毫秒值與?nanos?毫微秒參數值之和指定的超時時間已用完。

然后,該線程等到重新獲得對監視器的所有權后才能繼續執行。

對于某一個參數的版本,實現中斷和虛假喚醒是有可能的,并且此方法應始終在循環中使用:

synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout, nanos);
... // Perform action appropriate to condition
}
此方法只應由作為此對象監視器的所有者的線程來調用。請參閱?notify?方法,了解線程能夠成為監視器所有者的方法的描述。

?

參數:
timeout?- 要等待的最長時間(以毫秒為單位)。
nanos?- 額外時間(以毫微秒為單位,范圍是 0-999999)。
拋出:
IllegalArgumentException?- 如果超時值是負數,或者毫微秒值不在 0-999999 范圍內。
IllegalMonitorStateException?- 如果當前線程不是此對象監視器的所有者。
InterruptedException?- 如果在當前線程等待通知之前或者正在等待通知時,其他線程中斷了當前線程。在拋出此異常時,當前線程的中斷狀態?被清除。

11.wait

public final void wait()
throws InterruptedException
導致當前的線程等待,直到其他線程調用此對象的?notify()?方法或?notifyAll()?方法。換句話說,此方法的行為就好像它僅執行?wait(0)?調用一樣。

當前的線程必須擁有此對象監視器。該線程發布對此監視器的所有權并等待,直到其他線程通過調用?notify?方法,或?notifyAll?方法通知在此對象的監視器上等待的線程醒來。然后該線程將等到重新獲得對監視器的所有權后才能繼續執行。

對于某一個參數的版本,實現中斷和虛假喚醒是可能的,而且此方法應始終在循環中使用:

synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
此方法只應由作為此對象監視器的所有者的線程來調用。請參閱?notify?方法,了解線程能夠成為監視器所有者的方法的描述。

?

拋出:
IllegalMonitorStateException?- 如果當前的線程不是此對象監視器的所有者。
InterruptedException?- 如果在當前線程等待通知之前或者正在等待通知時,另一個線程中斷了當前線程。在拋出此異常時,當前線程的中斷狀態?被清除。

轉載于:https://www.cnblogs.com/yqf6300/p/4952065.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256459.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ANSYS——載荷的方向

目錄 一、壓力的方向(FORCE) 1、為正的情況 2、為負的情況 二、壓強的方向(PRESSURE)

kindeditor用法簡單介紹(轉)

1&#xff0c;首先去官網下載http://www.kindsoft.net/ 2&#xff0c;解壓之后如圖所示&#xff1a; 由于本人做的是用的是JSP&#xff0c;所以ASP,PHP什么的就用不上了&#xff0c;直接把那些去掉然后將整個文件夾扔進Myeclipse&#xff0c;如圖&#xff1a; 里面有個報錯&am…

hadoop 分片與分塊,map task和reduce task的理解

分塊&#xff1a;Block HDFS存儲系統中&#xff0c;引入了文件系統的分塊概念&#xff08;block&#xff09;&#xff0c;塊是存儲的最小單位&#xff0c;HDFS定義其大小為64MB。與單磁盤文件系統相似&#xff0c;存儲在 HDFS上的文件均存儲為多個塊&#xff0c;不同的是&#…

SOLIDWORKS——參數化建模

https://www.sohu.com/a/259742200_100042821 知識點&#xff1a;投影曲線、曲面填充、掃描、外觀設置 建模步驟 1.先在工具——方程式里輸入一個直徑的變量A120 。 2.在前視基準面上草繪圓&#xff0c;畫一條直徑。直徑等于變量A。 3.旋轉&#xff0c;選擇粉色區域。 4.上視…

Arch 常用工具

一、網絡瀏覽pacman -S firefox firefox-i18n注&#xff1a;該命令中的前者為 Firefox 主程序,后者為語言包。pacman -S opera二、圖像編輯pacman -S gimp #圖像編輯軟件首選 GIMPpacman -S inkscape #矢量圖形編輯軟件Inkscapepacman -S scrot #…

Androd安全——反編譯技術完全解析

0&#xff0e;前言單純從技術角度上來講&#xff0c;掌握反編譯功能確實是一項非常有用的技能。另外既然別人可以反編譯程序&#xff0c;我們當然有理由應該對程序進行一定的保護&#xff0c;因此代碼混淆也是我們必須要掌握的一項技術。看完此篇如果對代碼混淆也感興趣&#x…

python——shape 與reshape

轉載自:https://blog.csdn.net/u010916338/article/details/84066369 shape()和reshape()都是數組array中的方法 numpy中reshape函數的三種常見相關用法 numpy.arange(n).reshape(a, b) 依次生成n個自然數&#xff0c;并且以a行b列的數組形式顯示np.arange(16).reshape(2,…

誤刪了microsoft visual c++后如何正常運行matlab

誤刪了microsoft visual c后如何正常運行matlab 本人在卸載visual studio2013的時候&#xff0c;因為這個軟件卸載的過程中出現一些問題&#xff0c;誤將visual c當成VS的組件一同刪除了。但是在打開matlab 時發現出錯&#xff0c;matlab打開后會出現下面的界面。 出現這個問題…

iScreenLocker 3.1.8 安卓鎖屏通知--蘋果一樣的體驗

*軟件介紹:蘋果鎖屏通知(iScreenLocker)是一款android上ios風格的鎖屏軟件。它顛覆安智通知設計&#xff0c;將原來狀態欄的通知搬到鎖屏界面上來&#xff0c;能夠在桌面輕松收發短信,微博,微信等消息。它獨有的消息喚醒功能。能使手機從待機界面喚醒而消耗非常少的電量。手指輕…

JSP慕課網階段用戶登錄小例子(不用數據庫)

getAttribute和setAttribute一起使用&#xff0c;而getParameter用于取得如request傳來的參數。 Web是請求/響應架構的使用&#xff0c;而request和response就是在服務器端生成的相應的兩個對象&#xff0c;request能夠獲取客戶端傳遞的參數及相關的一些信息&#xff0c;而resp…

機器學習python——python基礎

目錄 1、常用庫 2、shape與reshape&#xff0c;dtype 3、range、arange、linspace、logspace 4、數組的計算、切片 5、繪圖基本設置 6.三維繪圖 1、常用庫 numpy、scipy、matplotlib、math 2、shape與reshape&#xff0c;dtype https://blog.csdn.net/qq_45769063/arti…

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境 本人在給visual studio 2013配置opencv 環境下遇到過一些問題&#xff0c;比如配置不成功或者不能永久配置opencv環境。先將自己的配置經驗分享于此&#xff0c;希望同道中的好友可以用上。 首先自行下載Visual s…

屬性名、變量名與 內部關鍵字 重名 加

procedure TForm4.btn3Click(Sender: TObject); varMyQj: TQJson;MyPrinter: TPrinter; beginMyQj : TQJson.Create;tryMyPrinter.name : A號打印機;MyPrinter.status : enabled;MyPrinter.&type : yes;MyQj.FromRecord<TPrinter>(MyPrinter);Memo1.Lines.Add(MyQj.A…

機器學習——支持向量機SVM之線性模型

目錄 一、沒有免費的午餐定理 二、支持向量機SVM&#xff08;support vector machine&#xff09; 1、線性模型和非線性模型 2、如何在線性模型中畫出一條直線&#xff08;優化過程——vplink&#xff09; 1&#xff09;多少條&#xff1f; 2&#xff09;如何畫出最好的直…

Oauth2.0和1.0區別

1.0的授權分3步, A)客戶端到授權服務器請求一個授權令牌(request token&secret) B)引導用戶到授權服務器請求授權 C)用訪問令牌到授權服務器換取訪問令牌(access token&secret) D)用訪問令牌去訪問得到授權的資源 2.0的用戶授權過程有2步&#xff0c; A)引導用戶到授權…

選導師,定方向

選導師&#xff0c;定方向。 看文獻看到9.40&#xff0c;實在是看不下去&#xff0c;索性寫一些自己這近兩年來的研究生生涯的一些感悟&#xff0c;希望對還在迷茫中的你們有一點點的啟示&#xff08;如果談不上啟示&#xff0c;那就當給你們一點安慰&#xff09;。 ** 選導師…

在apache中設置訪問目錄后進入的默認頁面為index.php

找到apache的配置文件httpd.conf后找到 DirectoryIndex index.html index.php 在其中添加index.php, 轉載于:https://www.cnblogs.com/itdi/p/5844517.html

spring@PropertySource用法

v測試例子 package com.hjzgg.auth.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annot…

機器學習——支持向量機SVM之非線性模型(低維到高維映射)

目錄 一、非線性模型的最優化問題 1、非線性模型最優化模型 2、兩個概念 1&#xff09;正則項&#xff08;regularization term&#xff09; 2&#xff09;調參參數 2、高維映射 1&#xff09;定義及作用 2&#xff09;高維映射后的最優化模型 3&#xff09;異或問題&…

html表單中get與post之間的區別

當用戶在 HTML 表單 (HTML Form) 中輸入信息并提交之后&#xff0c;有兩種方法將信息從瀏覽器傳送到 Web 服務器 (Web Server)。 一種方法是通過 URL&#xff0c;另外一種是在 HTTP Request 的 body 中。 前一種方法&#xff0c;我們使用 HTML Form 中的 method "get&quo…