Apache Software Foundation Thinking in Java:好的OOP語言都具有作為開發包一部分的一組容器

咔啡發表於2020-12-27

引論 :
如果你不知道在解決某個特定問題時需要多少個物件,或者它們將存活多久,那麼你就不可能知道如何儲存這些物件。你如何才能知道需要多少空間來建立這些物件呢?答案是你不可能知道,因為這類資訊只有在執行時刻才能獲得。
對於物件導向設計中的大多數問題而言,這個問題的解決方案似乎過於簡單:建立另一種物件的型別。解決這個特定問題的新的物件型別持有對其它物件的引用。當然,你可以用在大多數語言中都可獲得的陣列型別來實現相同的功能。但是這個通常被稱為容器(container,也被稱為集合(collection),但是Java類庫以不同的含義使用這個術語,所以本書將使用容器這個詞)的新物件將在任何需要時可擴充自己的容量以容納你放置於其中的所有東西。因此你不需要知道將來會把多少個物件置於容器中,只需要建立一個容器物件,然後讓它處理所有細節。
幸運的是,好的OOP語言都具有作為開發包一部分的一組容器。在C++中,容器是標準C++類庫的一部分,有時也稱為標準模板類庫(Standard Template Library, STL)。Object Pascal在其視覺化構件庫(Visual Component Library)中具有容器。Smalltalk提供了一個非常完備的容器集。Java在其標準類庫中也有容器。在某些類庫中,通用容器足夠滿足所有的需要,但是在其它類庫(例如Java)中,具有滿足不同需要的不同型別的容器,例如List類(列表,用於儲存序列),Map類(雜湊表,也被稱為關聯陣列,用來建立物件之間的關聯),Set類(集類,用於儲存一類物件)。容器類庫還可能包括Queue(佇列)、Tree(樹)、Stack(堆疊)等。
所有容器都有某種方式來處理元素的置入和取出。某些通用的方法用來在容器中新增元素,而另一些用來將元素取出。但是取出元素可能問題會更多一些,因為單一選取(single-selection)的方法是很受限的。如果你想操作或是比較容器中的一組元素時,用什麼方式來替代單一選取呢?
解決的方法是迭代器(iterator),它是一個用來選取容器中的元素,並把它呈現給迭代器使用者的物件。作為一個類,它也提供了某種抽象層次。這種抽象可以用來把容器的細節從訪問容器的程式碼中分離出來。容器通過迭代器被抽象為僅僅是一個序列(sequence)。迭代器允許你遍歷這個序列而不用擔心底層的結構,也就是說,不用關心它是一個Arraylist、LinkedList、Stack還是其他什麼東西。這給你提供了極大的靈活性,使得你不用干擾你的程式程式碼就可以十分方便地修改底層資料結構。Java的1.0和1.1版本有一個為所有容器類設計的被稱為Enumeration的標準迭代器,Java 2增加了一個完備得多的容器類庫,其中包含一個被稱為Iterator的比老式的Enumeration能做得更多的迭代器。從設計的觀點來看,你真正需要的只是一個可以被操作,從而解決問
從設計的觀點來看,你真正需要的只是一個可以被操作,從而解決問題的序列。如果單一型別的序列可以滿足你的所有需要,那麼就沒有理由設計不同種類的序列了。有兩個原因使得你還是需要對容器有所選擇。第一,不同容器提供了不同型別的介面和外部行。堆疊與佇列就具備不同的介面和行為,也不同於集合(set)和列表。其中某種容器提供的問題解決方案可能比其它容器要靈活的多。第二,不同的容器對於某些操作具有不同的效率。最好的例子就是兩種List的比較:ArrayList和LinkedList。它們都是具有相同介面和外部行為的簡單的序列,但是它們對某些操作所花費的代價卻有天壤之別。在ArrayList中隨機訪問元素是一個花費固定時間的操作,但是,對LinkedList來說,隨即選取元素需要在列表中移動,其代價是高昂的,訪問越靠近表尾的元素,花費的時間越長。另一方面,如果你想在序列中間插入一個元素,LinkedList的開銷卻比ArrayList要小。上述以及其它操作的效率,依序列底層結構的不同而存在很大的差異。在設計階段,你開始可以使用LinkedList,在優化系統效能時,改用ArrayList。基類List和迭代器所帶來的抽象把你在容器之間進行轉換時對程式碼產生的影響降到了最低。

提問:
怎樣在方法裡面得到Request,或者Session?
如果想在攔截的方法裡面得到從前臺傳入的引數,怎麼得到?
如果前臺有很多個引數傳入,並且這些引數都是一個物件的,那麼怎麼樣快速得到這個物件?
Spring MVC中函式的返回值是什麼?
Spring MVC用什麼物件從後臺向前臺傳遞資料的?
怎麼樣把ModelMap裡面的資料放入Session裡面?
什麼是 JavaConfig?
Spring Boot 自動配置原理是什麼?
你如何理解 Spring Boot 配置載入順序?
什麼是 YAML?
YAML 配置的優勢在哪裡 ?
Spring Boot 是否可以使用 XML 配置 ?
spring boot 核心配置檔案是什麼?bootstrap.properties 和 application.properties 有何區別 ?
什麼是 Spring Profiles?
如何在自定義埠上執行 Spring Boot 應用程式?
如何實現 Spring Boot 應用程式的安全性?
比較一下 Spring Security 和 Shiro 各自的優缺點 ?
Spring Boot 中如何解決跨域問題 ?
什麼是 CSRF 攻擊?
Spring Boot 中的監視器是什麼?
如何在 Spring Boot 中禁用 Actuator 端點安全性?
我們如何監視所有 Spring Boot 微服務?
什麼是 WebSockets?
什麼是 Spring Data ?
什麼是 Spring Batch?
什麼是 FreeMarker 模板?
如何整合 Spring Boot 和 ActiveMQ?
什麼是 Apache Kafka?
什麼是 Swagger?你用 Spring Boot 實現了它嗎?
前後端分離,如何維護介面文件 ?如何重新載入 Spring Boot 上的更改,而無需重新啟動伺服器?Spring Boot專案如何熱部署?
您使用了哪些 starter maven 依賴項?
Spring Boot 中的 starter 到底是什麼 ?
spring-boot-starter-parent 有什麼用 ?
Spring Boot 打成的 jar 和普通的 jar 有什麼區別 ?
執行 Spring Boot 有哪幾種方式?
Spring Boot 需要獨立的容器執行嗎?
開啟 Spring Boot 特性有哪幾種方式?
如何使用 Spring Boot 實現異常處理?
如何使用 Spring Boot 實現分頁和排序?
微服務中如何實現 session 共享 ?
Spring Boot 中如何實現定時任務 ?
比較一下 Spring Security 和 Shiro 各自的優缺點 ?
Spring Boot 中如何解決跨域問題 ?
什麼是 CSRF 攻擊?
在這裡插入圖片描述

相關文章