1. 程式人生 > >Java序列化的方式、object類中的方法、介面和抽象類的區別、ArrayList在迴圈過程中刪除

Java序列化的方式、object類中的方法、介面和抽象類的區別、ArrayList在迴圈過程中刪除

Java序列化的方式

a.是相應的物件實現了序列化介面Serializable,這個使用的比較多,對於序列化介面Serializable介面是一個空的介面,它的主要作用就是標識這個物件時可序列化的,jre物件在傳輸物件的時候會進行相關的封裝。

b.Externlizable介面繼承了java的序列化介面,並增加了兩個方法:

     void writeExternal(ObjectOutput out) throws IOException;

     void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;

     首先,我們在序列化物件的時候,由於這個類實現了Externalizable 介面,在writeExternal()方法裡定義了哪些屬性可以序列化,哪些不可以序列化,所以,物件在經過這裡就把規定能被序列化的序列化儲存檔案,不能序列化的不處理,然後在反序列的時候自動呼叫readExternal()方法,根據序列順序挨個讀取進行反序列,並自動封裝成物件返回,然後在測試類接收,就完成了反序列。  public void writeExternal(ObjectOutput out) throws IOException {         // TODO Auto-generated method stub

        out.writeObject(name);         out.writeObject(age);     }

object類中的方法

protected Object clone() //建立並返回此物件的一個副本。

boolean equals(Object obj) //指示某個其他物件是否與此物件“相等”。

protected void finalize() //當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法。

Class<? extends Object> getClass() //返回一個物件的執行時類。

int hashCode() //返回該物件的雜湊碼值。

void notify() //喚醒在此物件監視器上等待的單個執行緒。

void notifyAll() //喚醒在此物件監視器上等待的所有執行緒。

String toString() //返回該物件的字串表示。

void wait() //導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法。

void wait(long timeout) //導致當前的執行緒等待,直到其他執行緒呼叫此物件的 notify() 方法或notifyAll() 方法,或者超過指定的時間量。

void wait(long timeout, int nanos) //導致當前的執行緒等待,直到其他執行緒呼叫此物件的notify() 方法或 notifyAll() 方法,或者其他某個執行緒中斷當前執行緒,或者已超過某個實際時間量。  

介面和抽象類的區別,注意JDK8的介面可以有實現。

下面是介面和抽象類的不同點: 1. 介面能夠多實現,而抽象類只能單獨被繼承,其本質就是,一個類能繼承多個介面,而只能繼承一個抽象類。

2. 方法上,抽象類的方法可以用abstract 和public或者protect修飾。而介面預設為public abttact 修飾。

3. 抽象類的方法可以有需要子類實現的抽象方法,也可以有具體的方法。而介面在老版本的jdk中,只能有抽象方法,但是Java8版本的介面中,介面可以帶有預設方法。

4. 屬性上,抽象類可以用各種各樣的修飾符修飾。而介面的屬性是預設的public static final

5. 抽象類中可以含有靜態程式碼塊和靜態方法,而介面不能含有靜態方法和靜態程式碼塊。

6. 抽象類可以含有構造方法,介面不能含有構造方法。

7. 設計層面上,抽象類表示的是子類“是不是”屬於某一類的子類,介面則表示“有沒有”特性“能不能”做這種事。如飛機和鳥都能飛,但是他們在設計上實現一個Fly介面,實現fly()方法。遠比兩個類繼承飛行物抽象類好得多。因為,飛機和鳥有太多的屬性不一樣。

8. 設計層面上,另外一點,抽象類可以是一個模板,因為可以自己帶集體方法,所以要加一個實現類都能有的方法,直接在抽象類中寫出並實現就好,介面在以前的版本則不行。新版本Java8才有預設方法。

9. 既然說到Java 8 那麼就來說明,Java8中的介面中的預設方法是可以被多重繼承的。而抽象類不行。

10. 另外,介面只能繼承介面。而抽象類可以繼承普通的類,也能繼承介面和抽象類。

一個ArrayList在迴圈過程中刪除,會不會出問題,為什麼?

由arraylist原始碼可知,其刪除方法中用到了執行System.arraycopy方法,導致刪除元素時涉及到陣列元素的移動。 出錯一:  public static void remove(ArrayList<String> list) {         for (int i = 0; i < list.size(); i++) {             String s = list.get(i);             if (s.equals("bb")) {                 list.remove(s);             }         }     } 遍歷第二個元素字串bb時因為符合刪除條件,所以將該元素從陣列中刪除,並且將後一個元素移動(也是字串bb)至當前位置,導致下一次迴圈遍歷時後一個字串bb並沒有遍歷到,所以無法刪除。 解決方法: 1.倒序遍歷時即使發生元素刪除也不影響後序元素遍歷。 2.使用iterator迭代 在這個iterator中的next方法中會呼叫checkforComodification會檢查