JAVA中几个常用的方法
????類Object是類層次結構的根類,每一個類都使用Object作為超類,所有對象(包括數組)都實現這個類的方法。jdk1.5中,描述了該類中的11個方法
1.getClass
public final Class<? extends Object> getClass()?
?
2.hashCode
public int hashCode()hashCode?的常規協定是:
- 在 Java 應用程序執行期間,在同一對象上多次調用?hashCode?方法時,必須一致地返回相同的整數,前提是對象上?equals?比較中所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。
- 如果根據?equals(Object)?方法,兩個對象是相等的,那么在兩個對象中的每個對象上調用?hashCode?方法都必須生成相同的整數結果。
- 以下情況不?是必需的:如果根據?equals(java.lang.Object)?方法,兩個對象不相等,那么在兩個對象中的任一對象上調用?hashCode?方法必定會生成不同的整數結果。但是,程序員應該知道,為不相等的對象生成不同整數結果可以提高哈希表的性能。
實際上,由?Object?類定義的 hashCode 方法確實會針對不同的對象返回不同的整數。(這一般是通過將該對象的內部地址轉換成一個整數來實現的,但是 JavaTM?編程語言不需要這種實現技巧。)
?
3.equals
public boolean equals(Object?obj)equals?方法在非空對象引用上實現相等關系:
- 自反性:對于任何非空引用值?x,x.equals(x)?都應返回?true。
- 對稱性:對于任何非空引用值?x?和?y,當且僅當?y.equals(x)?返回?true?時,x.equals(y)?才應返回?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。
Object?類的?equals?方法實現對象上差別可能性最大的相等關系;即,對于任何非空引用值?x?和?y,當且僅當?x?和?y?引用同一個對象時,此方法才返回?true(x == y?具有值true)。
注意:當此方法被重寫時,通常有必要重寫?hashCode?方法,以維護?hashCode?方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。
?
4.clone
protected Object clone() throws CloneNotSupportedException按照慣例,返回的對象應該通過調用?super.clone?獲得。如果一個類及其所有的超類(Object?除外)都遵守此約定,則?x.clone().getClass() == x.getClass()。
按照慣例,此方法返回的對象應該獨立于該對象(正被克隆的對象)。要獲得此獨立性,在?super.clone?返回對象之前,有必要對該對象的一個或多個字段進行修改。這通常意味著要復制包含正在被克隆對象的內部“深層結構”的所有可變對象,并使用對副本的引用替換對這些對象的引用。如果一個類只包含基本字段或對不變對象的引用,那么通常不需要修改?super.clone?返回的對象中的字段。
Object?類的?clone?方法執行特定的克隆操作。首先,如果此對象的類不能實現接口?Cloneable,則會拋出?CloneNotSupportedException。注意:所有的數組都被視為實現接口Cloneable。否則,此方法會創建此對象的類的一個新實例,并像通過分配那樣,嚴格使用此對象相應字段的內容初始化該對象的所有字段;這些字段的內容沒有被自我克隆。所以,此方法執行的是該對象的“淺表復制”,而不“深層復制”操作。
Object?類本身不實現接口?Cloneable,所以在類為?Object?的對象上調用?clone?方法將會導致在運行時拋出異常。
?
5.toString
public String toString()Object?類的?toString?方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符“@”和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())?
6.notify
public final void notify()直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競爭;例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。
此方法只應由作為此對象監視器的所有者的線程來調用。通過以下三種方法之一,線程可以成為此對象監視器的所有者:
- 通過執行此對象的同步 (Sychronized) 實例方法。
- 通過執行在此對象上進行同步的?synchronized?語句的正文。
- 對于?Class?類型的對象,可以通過執行該類的同步靜態方法。
一次只能有一個線程擁有對象的監視器。
?
7.notifyAll
public final void notifyAll()直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競爭;例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。
此方法只應由作為此對象監視器的所有者的線程來調用。請參閱?notify?方法,了解線程能夠成為監視器所有者的方法的描述。
?
8.finalize
protected void finalize() throws Throwablefinalize?的常規協定是:當 JavaTM?虛擬機已確定尚未終止的任何線程無法再通過任何方法訪問此對象時,將調用此方法,除非由于準備終止的其他某個對象或類的終結操作執行了某個操作。finalize?方法可以采取任何操作,其中包括再次使此對象對其他線程可用;不過,finalize?的主要目的是在不可撤消地丟棄對象之前執行清除操作。例如,表示輸入/輸出連接的對象的 finalize 方法可執行顯式 I/O 事務,以便在永久丟棄對象之前中斷連接。
Object?類的?finalize?方法執行非特殊性操作;它僅執行一些常規返回。Object?的子類可以重寫此定義。
Java 編程語言不保證哪個線程將調用某個給定對象的?finalize?方法。但可以保證在調用 finalize 時,調用 finalize 的線程將不會持有任何用戶可見的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那么該異常將被忽略,并且該對象的終結操作將終止。
在啟用某個對象的?finalize?方法后,將不會執行進一步操作,直到 Java 虛擬機再次確定尚未終止的任何線程無法再通過任何方法訪問此對象,其中包括由準備終止的其他對象或類執行的可能操作,在執行該操作時,對象可能被丟棄。
對于任何給定對象,Java 虛擬機最多只調用一次?finalize?方法。
finalize?方法拋出的任何異常都會導致此對象的終結操作停止,但可以通過其他方法忽略它。
?
9.wait
public final void wait(long?timeout) throws InterruptedException當前的線程必須擁有此對象監視器。
此方法導致當前線程(稱之為?T)將其自身放置在對象的等待集中,然后放棄此對象上的所有同步要求。出于線程調度目的,線程?T?被禁用,且處于休眠狀態,直到發生以下四種情況之一:
- 其他某個線程調用此對象的?notify?方法,并且線程?T?碰巧被任選為被喚醒的線程。
- 其他某個線程調用此對象的?notifyAll?方法。
- 其他某個線程中斷線程?T。
- 已經到達指定的實際時間。但是,如果?timeout?為零,則不考慮實際時間,該線程將一直等待,直到獲得通知。
在沒有被通知、中斷或超時的情況下,線程還可以喚醒一個所謂的虛假喚醒?(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?方法,了解線程能夠成為監視器所有者的方法的描述。
?
10.wait
public final void wait(long?timeout, int?nanos) throws InterruptedException此方法類似于一個參數的?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?方法,了解線程能夠成為監視器所有者的方法的描述。?
11.wait
public final void wait() throws InterruptedException當前的線程必須擁有此對象監視器。該線程發布對此監視器的所有權并等待,直到其他線程通過調用?notify?方法,或?notifyAll?方法通知在此對象的監視器上等待的線程醒來。然后該線程將等到重新獲得對監視器的所有權后才能繼續執行。
對于某一個參數的版本,實現中斷和虛假喚醒是可能的,而且此方法應始終在循環中使用:
synchronized (obj) { while (<condition does not hold>) obj.wait(); ... // Perform action appropriate to condition } 此方法只應由作為此對象監視器的所有者的線程來調用。請參閱?notify?方法,了解線程能夠成為監視器所有者的方法的描述。?
轉載于:https://www.cnblogs.com/yqf6300/p/4952065.html
總結
以上是生活随笔為你收集整理的JAVA中几个常用的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ansible user模块添加用户、密
- 下一篇: Java实现发邮件功能---网易邮箱