2011年7月4日 星期一

《Java認證SCJP 6.0/5.0:猛虎出閘》筆記

一.Java語言基礎

1.程式中宣告的優先順序:package->import->class


2.使用import將函式庫載入,並不會影響程式的效能。因編譯器只會import程式碼中有用到的類別


3.存取修飾元
private:同一個class才可存取

defult:同一個package的class才可存取

protected:同一個package的class才可存取,不同package的則要有繼承關係才可存取

public:皆可存取


4.Java變數在記憶體中的儲存空間配置
Global:存放static的類別成員變數。在這空間內存放的類別成員變數將是屬於這個類別的,也是Java程式在執行期間一直被維護的資料,不會因為存取它的物件更動,而配置一個新的static成員變數供該物件存取

Stack:存放基本資料型別的變數內容,或物件變數的參考內容值。當新的宣告產生時,stack將有指標直接指向該變數,所以存取該變數資料內容時速度較快。也就是說,在stack中是利用指標的來回移動指向該變數,以幫助程式能快速存取該變數的內容值,作為程式執行的參考和判斷

Heap:存放參考資料型別的物件實體,但該物件的參考內容值是存放在stack中。也就是說,當宣告了一個參考資料型別物件,並用new來產生此物件實體,物件參考值將會存在stack中,new所產生的物件實體則在記憶體的heap中配置一塊新區域存放,同時在stack中的物件參考值也將指向heap中的物件實體



二.Java物件導向

1.Vararg變長參數
可傳入任意數量的參數

public int Calc(int... a){...}

﹡具有省略號的參數必須是在方法參數列中的最後一個。如(int x, int... a)

﹡一個方法最多只能有一個省略號

﹡當使用省略號做為方法中唯一的參數列時,呼叫端不傳進參數也是被允許的


2.覆寫equals()時也應一律覆寫hashCode()



三.Java例外處例機制

1.throw所丟出的例外類別必須是throws的子類別

2.自訂例外的步驟: 1.產生自訂例外類別 2.在宣告方法時加入throws修飾 3.在方法中使用throw new 自訂例外類別("xxx")以丟出例外 4.在try-catch程式區塊內呼叫該方法或再throws出去



四.Java多執行緒

1.實作Runnable介面,必須搭配Thread類別才能建立執行緒物件

2.Runnable介面可以避開Java中單一繼承的限制,且程式較有一致性

3.synchronized發生時,該執行緒會將欲鎖定的物件旗標拿回,使得外界無法存取該物件的資源,等到鎖定解除(該synchronized區塊或方法執行完畢)時再將旗標歸還給該物件



五.Java集合架構與泛型

1.集合的四個特性: 1.排序性(Sorted):利用實作equals()方法將集合元素內容做遞增排序 2.順序性(Ordered):排序會依某種特定順序擺放,取出時也依相同順序取出 3.重複性(Duplicates):是否允許出現/存放的物件在集合元素中 4.鍵值(Use Key):使用鍵值來參考到真正物件所存放的位置,每一個在集合元素中存放的物件都有相對應的鍵值。鍵值必須唯一,每一個鍵值最多只能對應一個元素


2.Set介面:實作了Collection,因此也包含Collection中所有方法。Set中所放置的元素是無順序性,且元素間不得重複。在實作上,Set會利用equals()來判斷所加入的元素內容是否重覆

HashSet類別:是一種元素內容沒有順序性、排序性的集合。HashSet是利用hashCode()來搜尋指定的元素。在HashSet中,每個元素都必須定義一個hashCode(),實務上可利用HashSet來達到快速搜尋的效果

LinkedHashSet類別:元素內容具有順序性,若想將內容依序取出,則可將HashSet集合轉換為LinkedHashSet集合。每個元素都含有next與previous節點來指向其他的元素。

SortedSet介面:會將元素內容按照字母順序做遞增排列(自然排序)

TreeSet介面:元素內容具自然排序。所有的集合元素都必須是相同的資料型別,且不可為null


3.List介面:元素依index排序,且資料可重複。每個集合元素都有index索引值,且可任意在加入集合元素時就給定索引值,也可透過get()根據該index索引值找到當下的集合元素內容

ArrayList類別:可自由地擴增容量。實作時只需用到add()與get()來置入與取出元素

Vector類別:特性與ArrayList相同。所有對外的public方法都會加上synchronized,使得效率變差

Stack類別:為Vector的子類別,支援堆疊後進先出的原則,並可利用push()加入元素內容,peek()與pop()取得元素內容。
﹡peek()與pop()差別在於,pop()在取得元素內容後會將該元素刪除

LinkedList類別:同ArrayList類別。以走訪元素而言ArrayList較優,以新增/移除元素而言LinkedList較優

Queue介面:是一種先進先出的集合。以offer()新增元素,poll()移除元素。實作Queue介面的為LinkedList類別


4.Map介面:利用指定鍵值來決定元素擺放的位置。鍵值不得重複,每個鍵值只能對應一個元素。雖鍵值不得重複,但不同的鍵值卻允許儲存重複的元素內容。Map最大的好處是可個別操作鍵值與元素內容

HashMap類別:無順序性、排序性的集合。其鍵值與元素內容皆可為null

Hashtable類別:無順序性、排序性的集合。其鍵值與元素內容不得置入null

LinkedHashMap類別:依元素加入次序的順序性集合,無排序性。以走訪元素而言LinkedHashMap較優,以新增/移除元素而言HashMap較優

SortedMap介面:可依據元素的Key值做自然排序。其key值不得重複也不得為null,但元素內容允許重複

TreeMap類別:具自然排序。所有的鍵值必須是同一種資料型別


5.泛型:一些包含類型參數的類型,也就是說泛型的參數只可以代表類別,但不能代表個別物件

public class GenericFoo<T> {
    private T foo;
    public void setFoo(T foo) {
        this.foo = foo;
    }
    public T getFoo() {
        return foo;
    }
}

<T> 用來宣告一個型態持有者(Holder)T,之後您可以用 T 作為型態代表來宣告變數(參考)名稱,然後您可以像下面的程式來使用這個類別:
GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>();
GenericFoo<Integer> foo2 = new GenericFoo<Integer>();

foo1.setFoo(new Boolean(true));
Boolean b = foo1.getFoo();

foo2.setFoo(new Integer(10));
Integer i = foo2.getFoo();

不同的地方在於,在宣告與配置物件時,您可以一併指定泛型類別中真正的型態,這將用來取代定義時所使用的 T,而這次您可以看到,介面轉換不再需要了,所定義出來的泛型類別在使用時多了一層安全性

ps:泛型程式碼及說明引用自良葛格學習筆記:http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/DefineGenericsClass.htm
泛型定義引用自維基百科:http://zh.wikipedia.org/wiki/%E6%B3%9B%E5%9E%8B

﹡泛型不可接受基本資料型別


讓迭代器(走訪集合元素)支援泛型:Iterator<String> a = b.iterator


泛化方法中的回傳型別:static Vector<String> getMyVector(){...}


泛型中的多型:泛型的多型被轉換標的指的是當下被泛化的基底型別
Vector<Integer> v = new Vector<Integer>();
List<Integer> v2 = v;


型別萬用字元:<?>
static void MyVector(Vector<?> v){...}


限制型別參數:<? extends 類別名稱>
static void MyVector(Vector<? extends Number> v){...}


自訂泛型類別
public class Computer<A>{
    private Vector<A> v;
    public Computer(){
        v = new Vector<A>();
    }
}

沒有留言:

張貼留言