本文目錄一覽:
java中幾種Map在什麼情況下使用,並簡單介紹原因及原理
一、Map用於保存具有映射關係的數據,Map里保存着兩組數據:key和value,它們都可以使任何引用類型的數據,但key不能重複。所以通過指定的key就可以取出對應的value。Map接口定義了如下常用的方法:
1、void clear():刪除Map中所以鍵值對。
2、boolean containsKey(Object key):查詢Map中是否包含指定key,如果包含則返回true。
3、boolean containsValue(Object value):查詢Map中是否包含指定value,如果包含則返回true。
4、Set entrySet():返回Map中所包含的鍵值對所組成的Set集合,每個集合元素都是Map.Entry對象(Entry是Map的內部類)。
5、Object get(Object key):返回指定key所對應的value,如Map中不包含key則返回null。
6、boolean isEmpty():查詢Map是否為空,如果空則返回true。
7、Set keySet():返回該Map中所有key所組成的set集合。
8、Object put(Object key,Object value):添加一個鍵值對,如果已有一個相同的key值則新的鍵值對覆蓋舊的鍵值對。
9、void putAll(Map m):將指定Map中的鍵值對複製到Map中。
10、Object remove(Object key):刪除指定key所對應的鍵值對,返回可以所關聯的value,如果key不存在,返回null。
11、int size():返回該Map里的鍵值對的個數。
12、Collection values():返回該Map里所有value組成的Collection。
Map中包含一個內部類:Entry。該類封裝了一個鍵值對,它包含了三個方法:
1、Object getKey():返回該Entry里包含的key值。
2、Object getValeu():返回該Entry里包含的value值。
3、Object setValue(V value):設置該Entry里包含的value值,並返回新設置的value值。
二、HashMap和Hashtable實現類:
1、HashMap與HashTable的區別:
1) 同步性:Hashtable是同步的,這個類中的一些方法保證了Hashtable中的對象是線程安全的。而HashMap則是異步的,因此HashMap中的對象並不是線程安全的。因為同步的要求會影響執行的效率,所以如果你不需要線程安全的集合那麼使用HashMap是一個很好的選擇,這樣可以避免由於同步帶來的不必要的性能開銷,從而提高效率。
2) 值:HashMap可以讓你將空值作為一個表的條目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一個key值為null,但可以有無數多個value值為null。
2、性能:HashMap的性能最好,HashTable的性能是最差(因為它是同步的)
3、注意:
1)用作key的對象必須實現hashCode和equals方法。
2)不能保證其中的鍵值對的順序
3)盡量不要使用可變對象作為它們的key值。
三、LinkedHashMap:
它的父類是HashMap,使用雙向鏈表來維護鍵值對的次序,迭代順序與鍵值對的插入順序保持一致。LinkedHashMap需要維護元素的插入順序,so性能略低於HashMap,但在迭代訪問元素時有很好的性能,因為它是以鏈表來維護內部順序。
四、TreeMap:
Map接口派生了一個SortMap子接口,SortMap的實現類為TreeMap。TreeMap也是基於紅黑樹對所有的key進行排序,有兩種排序方式:自然排序和定製排序。Treemap的key以TreeSet的形式存儲,對key的要求與TreeSet對元素的要求基本一致。
1、Map.Entry firstEntry():返回最小key所對應的鍵值對,如Map為空,則返回null。
2、Object firstKey():返回最小key,如果為空,則返回null。
3、Map.Entry lastEntry():返回最大key所對應的鍵值對,如Map為空,則返回null。
4、Object lastKey():返回最大key,如果為空,則返回null。
5、Map.Entry higherEntry(Object key):返回位於key後一位的鍵值對,如果為空,則返回null。
6、Map.Entry lowerEntry(Object key):返回位於key前一位的鍵值對,如果為空,則返回null。
7、Object lowerKey(Object key):返回位於key前一位key值,如果為空,則返回null。
8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回該Map的子Map,其key範圍從fromKey到toKey。
9、SortMap subMap(Object fromKey,Object toKey );返回該Map的子Map,其key範圍從fromkey(包括)到tokey(不包括)。
10、SortMap tailMap(Object fromkey ,boolean inclusive):返回該Map的子Map,其key範圍大於fromkey(是否包括取決於第二個參數)的所有key。
11、 SortMap headMap(Object tokey ,boolean inclusive):返回該Map的子Map,其key範圍小於tokey(是否包括取決於第二個參數)的所有key。
五、WeakHashMap:
WeakHashMap與HashMap的用法基本相同,區別在於:後者的key保留對象的強引用,即只要HashMap對象不被銷毀,其對象所有key所引用的對象不會被垃圾回收,HashMap也不會自動刪除這些key所對應的鍵值對對象。但WeakHashMap的key所引用的對象沒有被其他強引用變量所引用,則這些key所引用的對象可能被回收。WeakHashMap中的每個key對象保存了實際對象的弱引用,當回收了該key所對應的實際對象後,WeakHashMap會自動刪除該key所對應的鍵值對。
六、IdentityHashMap類:
IdentityHashMap與HashMap基本相似,只是當兩個key嚴格相等時,即key1==key2時,它才認為兩個key是相等的 。IdentityHashMap也允許使用null,但不保證鍵值對之間的順序。
七、EnumMap類:
1、EnumMap中所有key都必須是單個枚舉類的枚舉值,創建EnumMap時必須顯示或隱式指定它對應的枚舉類。
2、EnumMap根據key的自然順序,即枚舉值在枚舉類中定義的順序,來維護鍵值對的次序。
3、EnumMap不允許使用null作為key值,但value可以。
Python多線程總結
在實際處理數據時,因系統內存有限,我們不可能一次把所有數據都導出進行操作,所以需要批量導出依次操作。為了加快運行,我們會採用多線程的方法進行數據處理, 以下為我總結的多線程批量處理數據的模板:
主要分為三大部分:
共分4部分對多線程的內容進行總結。
先為大家介紹線程的相關概念:
在飛車程序中,如果沒有多線程,我們就不能一邊聽歌一邊玩飛車,聽歌與玩 遊戲 不能並行;在使用多線程後,我們就可以在玩 遊戲 的同時聽背景音樂。在這個例子中啟動飛車程序就是一個進程,玩 遊戲 和聽音樂是兩個線程。
Python 提供了 threading 模塊來實現多線程:
因為新建線程系統需要分配資源、終止線程系統需要回收資源,所以如果可以重用線程,則可以減去新建/終止的開銷以提升性能。同時,使用線程池的語法比自己新建線程執行線程更加簡潔。
Python 為我們提供了 ThreadPoolExecutor 來實現線程池,此線程池默認子線程守護。它的適應場景為突發性大量請求或需要大量線程完成任務,但實際任務處理時間較短。
其中 max_workers 為線程池中的線程個數,常用的遍歷方法有 map 和 submit+as_completed 。根據業務場景的不同,若我們需要輸出結果按遍歷順序返回,我們就用 map 方法,若想誰先完成就返回誰,我們就用 submit+as_complete 方法。
我們把一個時間段內只允許一個線程使用的資源稱為臨界資源,對臨界資源的訪問,必須互斥的進行。互斥,也稱間接制約關係。線程互斥指當一個線程訪問某臨界資源時,另一個想要訪問該臨界資源的線程必須等待。當前訪問臨界資源的線程訪問結束,釋放該資源之後,另一個線程才能去訪問臨界資源。鎖的功能就是實現線程互斥。
我把線程互斥比作廁所包間上大號的過程,因為包間里只有一個坑,所以只允許一個人進行大號。當第一個人要上廁所時,會將門上上鎖,這時如果第二個人也想大號,那就必須等第一個人上完,將鎖解開後才能進行,在這期間第二個人就只能在門外等着。這個過程與代碼中使用鎖的原理如出一轍,這裡的坑就是臨界資源。 Python 的 threading 模塊引入了鎖。 threading 模塊提供了 Lock 類,它有如下方法加鎖和釋放鎖:
我們會發現這個程序只會打印「第一道鎖」,而且程序既沒有終止,也沒有繼續運行。這是因為 Lock 鎖在同一線程內第一次加鎖之後還沒有釋放時,就進行了第二次 acquire 請求,導致無法執行 release ,所以鎖永遠無法釋放,這就是死鎖。如果我們使用 RLock 就能正常運行,不會發生死鎖的狀態。
在主線程中定義 Lock 鎖,然後上鎖,再創建一個子 線程t 運行 main 函數釋放鎖,結果正常輸出,說明主線程上的鎖,可由子線程解鎖。
如果把上面的鎖改為 RLock 則報錯。在實際中設計程序時,我們會將每個功能分別封裝成一個函數,每個函數中都可能會有臨界區域,所以就需要用到 RLock 。
一句話總結就是 Lock 不能套娃, RLock 可以套娃; Lock 可以由其他線程中的鎖進行操作, RLock 只能由本線程進行操作。
Map會話 頁面怎麼取數據
1. Get(即使用QueryString顯式傳遞) 方式:在url後面跟參數。 特點:簡單、方便。 缺點:字符串長度最長為255個字符;數據泄漏在url中。 適用數據:簡單、少量、關鍵的數據。 適用範圍:傳遞給自己、傳遞給另一個目標頁面;常用於2個頁面間傳遞數據。 用法:例如:url後加?UserID=…,跳轉到目標頁面,目標頁面在伺服端可用Request.QueryString[“InputText”]獲取其指定參數值。具體可參考打印書本P261
2. Post 方式:通用的方式。利用form提交。 特點:最常用的方法。常用技巧是把隱秘的數據存在隱藏域中由form提交。 適用數據:大量數據,包括文件上傳。 適用範圍:同Get方法 用法:在客戶端form指定action目標後submit、在asp.net的伺服端中使用server.Transfer(url)提交;在伺服端中用Request.Form[“FormFieldID”]獲取。
3. 頁面對象的屬性 方式:asp.net特有方式 。利用HttpContext獲取發請求的頁面的信息。 特點:可以直接存儲對象。 缺點:注意強制轉換的類型要正確。 適用數據:各種數據。 適用範圍:頁面之間傳遞複雜數據。 用法:獲取Context.Handler將其轉換為發請求的頁面的實例,隨後就可以輕鬆訪問其form中的字段、甚至屬性。其中的Context是指HttpContext對象,Handler是其屬性,Context.Handler的意思可以理解為創建源頁類的實例變量,而得到此實例之後,就可以直接訪問其中的屬性和Public方法了。可看下打印書本P263的具體使用。
4. cookie 方式:將數據存在客戶端的經典方法。 缺點:安全性低、受客戶端設置限制、一個站點僅存20個cookie,每個容量4096位元組。 有效期:自定義或被用戶清除 適用數據:用戶的會話數據(一般是用戶名,用戶的個性化設置信息等) 適用範圍:單個用戶、整個站點所有頁面 用法:引用Request.Cookies(讀取信息)、Response.Cookies(寫入信息)、或用HttpCookieCollection直接創建Cookie對象。具體可見打印書P252
5. Session 方式:將用戶數據存儲在伺服端。 特點:asp.net中可以設置session的存儲方式、位置、SessionID的保存是否依賴cookie。 可以直接存儲對象。 缺點:asp.net中有失效的隱患 有效期:用戶活動時間+自定義延遲。 適用數據:用戶的特有信息。 適用範圍:單個用戶、整個站點所有頁面。 用法:
複製C#代碼保存代碼Session[“CollectionName”] = value/object;
6. Cache 方式:將用戶數據存儲在伺服端數據緩存中。 特點:可以大大提高效率。 可以直接存儲對象。 缺點:數據更新不及時。 有效期:應用程序生命周期或自定義。 適用數據:所有頁面、所有用戶都可以共享的數據。 用法:
複製C#代碼保存代碼Cache[“CollectionName”] = value|object;
7. Appliction 方式: 將數據存儲於此,相當於全局變量。 特點:可以直接存儲對象。整個站點的共享數據。 有效期:應用程序生命周期。 適用數據:所有頁面、所有用戶共享的數據。 用法:
複製C#代碼保存代碼Appliction[“CollectionName”] = value|object;
8. ViewState 方式:asp.net特有機制,用來恢復頁面狀態。 特點:將頁面各控件及其所存數據序列化存在name為_ViewState的隱藏域中。 缺點:存在HTML中,安全性較低。可以設置加密和驗證,但數據量會大增、效率有影響。 適用數據:頁面PostBack需要保存的數據,數據太大會影響頁面發送效率。 適用範圍:頁面自身數據保存。 用法:
複製C#代碼保存代碼ViewState[“CollectionName”] = value;
9. Static 方式: 將數據存於靜態變量中。 特點:利於提高效率。 缺點:若用不好會致使用戶或頁面間數據紊亂,造成極大的隱患。建議只賦值一次,絕對禁止為單個用戶而更改此值。 適用數據:所有用戶共享的數據。 適用範圍:此類所有的頁面實例。 用法:在class中聲明靜態變量。 整理: 頁面自身保存數據可用的有ViewState,static變量。 頁面之間傳遞數據常用get,post,HttpContext,當然可以變通一下用於自身數據保存。 單用戶的所有頁面數據共享常用session,cookie,當然也可以應用在以上兩種情況。 整個應用程序(所有用戶所用頁面)的數據共享常用Appliction,cache,static變量。
總結: 當然可以變通下靈活應用來解決問題,但是要選擇合適的,常見到濫用Get和Session。 建議在用Request的時候要指明所取的集合,比如Get方法傳來的參數從QueryString集合取,Post的從Form取,cookie從Cookies里取。雖然用Request[]集合,以上幾種都可以取到,但是卻造成性能上的浪費,本來直接在Form集合中,卻遍歷了QueryString,Form,Cookies等集合才取出來。 ps:在計算機的世界裏,凡是提供服務的一方我們稱為伺服端(server),而接受服務的另一方我們稱作客戶端(client)。
原創文章,作者:UCGNU,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/329718.html