1. 程式人生 > 其它 >Java封裝CSV常用工具類

Java封裝CSV常用工具類

Set介面的框架

 * |----Collection介面:單列集合,用來儲存一個一個的物件
 *          |----Set介面:儲存無序的、不可重複的資料   -->高中講的“集合”
 *              |----HashSet:作為Set介面的主要實現類;執行緒不安全的;可以儲存null值
 *                  |----LinkedHashSet:作為HashSet的子類;遍歷其內部資料時,可以按照新增的順序遍歷
 *                                      對於頻繁的遍歷操作,LinkedHashSet效率高於HashSet.
 *              |----TreeSet:可以按照新增物件的指定屬性,進行排序。

特點

1. Set介面中沒有額外定義新的方法,使用的都是Collection中宣告過的方法。

2. 要求:向Set(主要指:HashSet、LinkedHashSet)中新增的資料,其所在的類一定要重寫hashCode()和equals()
要求:重寫的hashCode()和equals()儘可能保持一致性:相等的物件必須具有相等的雜湊碼
重寫兩個方法的小技巧:物件中用作 equals() 方法比較的 Field,都應該用來計算 hashCode 值。


一、Set:儲存無序的、不可重複的資料
    以HashSet為例說明:
    1. 無序性:不等於隨機性。儲存的資料在底層陣列中並非按照陣列索引的順序新增,而是根據資料的雜湊值決定的。

    2. 不可重複性:保證新增的元素按照equals()判斷時,不能返回true.即:相同的元素只能新增一個。

二、新增元素的過程:以HashSet為例:
        我們向HashSet中新增元素a,首先呼叫元素a所在類的hashCode()方法,計算元素a的雜湊值,
        此雜湊值接著通過某種演算法計算出在HashSet底層陣列中的存放位置(即為:索引位置),判斷
        陣列此位置上是否已經有元素:
            如果此位置上沒有其他元素,則元素a新增成功。 --->情況1
            如果此位置上有其他元素b(或以連結串列形式存在的多個元素),則比較元素a與元素b的hash值:
                如果hash值不相同,則元素a新增成功。--->情況2
                如果hash值相同,進而需要呼叫元素a所在類的equals()方法:
                       equals()返回true,元素a新增失敗
                       equals()返回false,則元素a新增成功。--->情況2

        對於新增成功的情況2和情況3而言:元素a 與已經存在指定索引位置上資料以連結串列的方式儲存。
        jdk 7 :元素a放到陣列中,指向原來的元素。
        jdk 8 :原來的元素在陣列中,指向元素a
        總結:七上八下

        HashSet底層:陣列+連結串列的結構。

LinkedHashSet的使用

LinkedHashSet作為HashSet的子類,在新增資料的同時,每個資料還維護了兩個引用,記錄此資料前一個
資料和後一個數據。
優點:對於頻繁的遍歷操作,LinkedHashSet效率高於HashSet