Android逆向(教程更新)|Java基礎語法-容器
0x01 基本概念
在我們開發程序中經常會與數據打交道,而我們一般是通過”容器”來容納和管理數據。那什么是“容器”呢?生活中的容器不難理解,是用來容納物體的,如鍋碗瓢盆、書包和快遞箱等。程序中的“容器”也有類似的功能,就是用來容納和管理數據。
實際上,我們之前學習的數組就是一種容器,可以在其中放置對象和相同類型的一組數據。而數組的容量是事先定義好,不能隨著需求的變化而擴容。基于數組并不能滿足我們對于“管理和組織數據的需求”,所以我們需要一種更強大、更靈活、容量隨時可擴的容器來裝載我們的對象。這就是我們要學習的容器,也叫集合。容器的接口層次結構圖如圖所示:

Java容器類類庫的用途是保存對象,可以將其分為2個概念:
- Collection:獨立元素的序列,這些元素都服從一條或多條規則。List、Set都是Collection的一種,List必須按照順序保存元素,而Set不能有重復元素。
- Map:Map是鍵值對類型,允許用戶通過鍵來查找對象。Hash表允許我們使用另一個對象來查找某個對象。
0x02 Collection接口
1)List的特點及實現類
List是有序、可重復的容器。List中每個元素都有索引標記。可以根據元素的索引標記訪問元素,從而精確控制這些元素。List允許加入重復的元素。更準確的來說,List通常允許滿足 e1.equals(e2) 的元素重復加入容器。List接口常用的實現類有3個:ArrayList、LinkedList和Vector。
2)ArrayList
ArrayList底層是用數組實現的存儲。ArrayList是長度可變數組,元素以線性方式連續存儲,內部允許存放重復元素。允許對元素進行隨機的快速訪問,但是向ArrayList中插入和刪除元素的速度較慢。ArrayList是非線程安全的。數組進行擴容時,會將老數組中的元素重新拷貝一份到新的數組中,每次數組容量的增長大約是其原容量的1.5倍。
特點:查詢效率高,增刪效率低,線程不安全。
3)LinkedList
LinkedLis底層用雙向鏈表實現的存儲,內部采用雙向循環鏈表實現,插入和刪除元素的速度較快,隨機訪問的速度較慢,LinkedList也是非線程安全的。
特點:查詢效率低,增刪效率高,線程不安全
4)Vector
Vector底層是用數組實現的List,相關的方法都加了同步檢查,所以Vector線程安全,效率低。
特點:線程安全,效率低。
0x03 Set接口
Set接口繼承Collection接口,Set容器的特點上面也提及過,無序不可重復。Set的常見實現類有HashSet、TreeSet等,我們一般使用HashSet。舉例如下:

0x04 Map接口
Map就是用來存儲“鍵(key)-值(value) 對”的。Map類中存儲的“鍵值對”通過鍵來標識,所以“鍵對象”不能重復。Map在實際開發中使用非常廣,特別是HashMap。put進行添加值鍵對,containsKey驗證主要是否存在、containsValue驗證值是否存在、keySet獲取所有的鍵集合、values獲取所有值集合、entrySet獲取鍵值對。舉例如下:

執行結果如下:

0x05總結
在后續協議分析實戰中,我們會經常見到關于HashMap的用法,學會HashMap的使用對于后續的逆向分析是非常有幫助的。
在這里關于java的課程講解就這么多了,很多細節以及實際操作在文章中并未講出,如果想要更深入細致的學習可以去網上尋找相關java視頻教程,不過我個人建議仍然是先了解個大概,需要用到時再去學習也不遲,希望大家能對之前講解的文章耐心的閱讀下來。