提出問題:
在寫一個dao的時候,我的需求是這個dao是一個萬能的,目前的方法只有一個查詢出實體類對應的表中所有的數據,通過傳入的對象,利用反射獲取實體類中的屬性名,屬性類型,利用字符串拼接獲取相應屬性對應的set方法,利用Method中的invoke方法執行set方法。由于實體類是通過表生成的,所以表中的字段和實體類中屬性的順序是一致的,每次通過反射依次獲取到屬性名,通過結果集get出來,當到這里的時候,遇到了一個問題,一開始想的是通過反射過去的屬性名和屬性類型是一一對應的,通過鍵值對的結構存儲不是更好嗎,屬性名作為鍵,因為不可能有重復的屬性名,屬性類型作為值放入map集合中。但是遇到了問題,從數據庫中查詢的結果集中獲取結果的時候需要知道每個字段的順序,這樣getString(1)或者getInt(2)……才可以,因為通過反射已經獲取到了屬性類型所以加一個判斷就可以選擇出使用哪一個get方法是getString()還是getInt()。由于map集合時無序的,我們接觸到最多的集合中只有List集合時有序的,但是不能存儲鍵值對,實體類中的屬性順序是和表中的字段順序對應的,我們可以利用這個解決這個問題,通過查了查,發現有一種map(LinkedHashMap)集合時有序的,可以做到按照用戶放入集合的順序取出集合中的元素,上面遇到的問題就解決了。
LinkedHashMap介紹:
簡單的介紹一下。通過LinkedHashMap這個名字可以看出來這是個鏈表和哈希表的結合,鏈表是有順序的,哈希表通常說是散列表,通過計算鍵的哈希值,用這個哈希值映射到表結構中,LinkedHashMap允許存儲null值,基本的和HashMap一致,通過鍵找到值,鍵不可以重復,值可以重復。下圖是LinkedHashMap的繼承關系,繼承于HashMap,所以基本的方法都是一致的。
LinkedHashMap的實現:
底層和HashMap一致,用哈希表實現,區別是LinkedHashMap還使用了一個雙向鏈表實現順序存取,這個雙向鏈表的實現依賴于Entry這個內部類,這個Entry內部類在集合中非常常見。通過查看Entry類中的方法實現也可以看出
在刪除和增加時,都在修改前面的引用和后面的引用。
在HashMap中只是利用了哈希表,而LinkedHashMap中還用到了鏈表記錄順序,在LinkedHashMap中并沒有put方法,而是利用了HashMap中的put方法,但是重寫了put方法中調用的的addEntry()方法
通過上面方法的分析,可以看出在添加節點的時候(由于是雙向鏈表)都會在尾部進行添加。