包含使用方法很簡單,最常用的可能就是map方法和submit+as_complete的詞條

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
UCGNU的頭像UCGNU
上一篇 2025-01-14 18:55
下一篇 2025-01-14 18:55

相關推薦

  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python符號定義和使用方法

    本文將從多個方面介紹Python符號的定義和使用方法,涉及注釋、變量、運算符、條件語句和循環等多個方面。 一、注釋 1、單行注釋 # 這是一條單行注釋 2、多行注釋 “”” 這是一…

    編程 2025-04-29
  • Python下載到桌面圖標使用方法用法介紹

    Python是一種高級編程語言,非常適合初學者,同時也深受老手喜愛。在Python中,如果我們想要將某個程序下載到桌面上,需要注意一些細節。本文將從多個方面對Python下載到桌面…

    編程 2025-04-29
  • Python匿名變量的使用方法

    Python中的匿名變量是指使用「_」來代替變量名的特殊變量。這篇文章將從多個方面介紹匿名變量的使用方法。 一、作為佔位符 匿名變量通常用作佔位符,用於代替一個不需要使用的變量。例…

    編程 2025-04-29
  • 百度地區熱力圖的介紹和使用方法

    本文將詳細介紹百度地區熱力圖的使用方法和相關知識。 一、什麼是百度地區熱力圖 百度地區熱力圖是一種用於展示區域內某種數據分佈情況的地圖呈現方式。它通過一張地圖上不同區域的顏色深淺,…

    編程 2025-04-29
  • Matlab中addpath的使用方法

    addpath函數是Matlab中的一個非常常用的函數,它可以在Matlab環境中增加一個或者多個文件夾的路徑,使得Matlab可以在需要時自動搜索到這些文件夾中的函數。因此,學會…

    編程 2025-04-29
  • Python函數重載的使用方法和注意事項

    Python是一種動態語言,它的函數重載特性有些不同於靜態語言,本文將會從使用方法、注意事項等多個方面詳細闡述Python函數重載,幫助讀者更好地應用Python函數重載。 一、基…

    編程 2025-04-28
  • Python同步賦值語句的使用方法和注意事項

    Python同步賦值語句是Python中用來同時為多個變量賦值的一種方法。通過這種方式,可以很方便地同時為多個變量賦值,從而提高代碼的可讀性和編寫效率。下面從多個方面詳細介紹Pyt…

    編程 2025-04-28
  • 微信mac版歷史版完整代碼示例與使用方法

    微信是一款廣受歡迎的即時通訊軟件,為了方便用戶在Mac電腦上也能使用微信,微信團隊推出了Mac版微信。本文將主要講解微信mac版歷史版的完整代碼示例以及使用方法。 一、下載微信ma…

    編程 2025-04-28
  • Python後綴名及其使用方法解析

    Python是一種通用性編程語言,其源文件使用.py作為文件後綴名。在本篇文章中,將會從多個方面深入解析Python的後綴名以及如何為Python源文件添加其他的後綴名。 一、.p…

    編程 2025-04-28

發表回復

登錄後才能評論