《Java編程思想》(第二版)第09章:持有你的對象
來源:互聯網
上載者:User
編程|對象
這是個十分簡單的計劃:一群固定數量且壽命已知的對象(objects).
你必須有能力在任何時刻,任何地點產生任意個數的對象。為此,Java提供了對象(或者應該說是對象的reference)的數種持有方式。有內建的array,還有utilities中的一套完整的容器類或者稱為叢集類(collection classes)。
Array和其他容器的區別:效率和型別。
如果可以的話你應該儘可能使用array。當然有時候他功能有限,所以需要其他容器。
Java array以及其他容器都會因為邊界檢查而帶來額外的效率負擔。
其他容器將持有對象一律視為Object型別。
基本型別(primitive types)不能直接放到普通容器中?
Array的各種初始化動作:
Java的引用機制使得返回一個array非常簡單。
Arrays class擁有一組static函數,能夠執行許多array公用函數:equals(),fill(),sort(),binarySearch()
當你不知道究竟需要多少對象時,你需要更複雜的方法來持有他們。Java提供一套容器類庫用以解決這個問題。基本類型包括:List,Set,Map可以用他們來解決極多問題。
他們可以置入任意個數的對象,撰寫應用程式的時候不需要擔心容量問題:
他們基本上可以分成兩個基本類別:collection,map。
容器的缺點:元素型別未定
這是因為Java容器是為object作為其元素類型的。往壞的方面說,這種設計存在一些問題能:1.你打算設計一些只能儲存貓的容器,但是使用者卻可以把狗存進去。2.拿出來的時候不知道它到底是貓還是狗,需要向下轉型downcasting.
還是讓我們往好的方面想吧:Java並不止於讓你無用容器內的對象。我們還有執行期異常(runtime exception),娃哈哈。
Tips:JDK1.4已採用”Generic Java”技術,成了名副其實的”泛型Java”。允許程式員在運用Java容器的時候,指定元素型別.文法非常接近C++,唯底層實現技術”完全不同”.
迭代器(Iterators)
一切都是為了代碼重用,如果沒有迭代器,我們可能在修改容器的時候可能要修改很多遍曆的代碼。有了Iterators對象,我們就可以重用了。
它的職責是走訪以及選擇序列(sequence)中的一連串對象。而用戶端程式員不需要知道或在意該序列的底層究竟如何?。他們是”lightware”對象:產生的代價很小。基於這個理由,你常會發現他有一些看似奇怪的限制,例如某些迭代器只能單向移動。
暈倒,太多了,用倒的時候再來看吧。J