<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ### map集合介紹 相比于List、Set。Map 則提供了元素存儲的另外一種方式。Map 集合類用于存儲鍵值對(key-value),一個鍵(key)對應一個值(value),鍵(key)不能重復。 #### map應用場景 舉個例子,比如教室里面所有學生的姓名,我們用list集合存儲不用考慮太多,用set集合存儲就需要考慮班級同學名字是否有重復的,因為set會去重。 如果用map集合存儲,則需要考慮的更多,首先要考慮把名字做為key還是作為value。如果把名字作為key,那要考慮,班上同學名字是否有重復,有重復的就不能作為key,map集合key不能重復的。假如名字不重復,名字可以作為key,那繼續考慮,每個key對應的value是什么,比如可以是學生成績、身高等,map集合value可以重復。這樣,一個學生姓名可以找到一個學生成績、身高等數據。 如果把名字定為value,班上同學名字是否有重復則不重要,那你就要為每一個名字找一個唯一不重復的key,比如可以是學號,學號都是唯一的。這樣一個學號就可以找到一個學生。 從代碼角度去理解, map集合由Map接口和Map接口的實現類組成。 #### Map接口常用的實現類有哪些? **HashMap、LinkedHashMap、TreeMap和MutableMap。** * HashMap:基于Map接口哈希表實現,通過哈希表對其內部的映射關系快速查找,存取效率高,迭代無序。 * LinkedHashMap:基于Map接口哈希表實現和鏈接列表實現,鏈接列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。 * TreeMap:基于紅黑樹實現的,迭代根據其鍵的自然順序進行排序,或者可以自行指定比較器。 #### map集合可以存儲什么類型數據呢? map集合可以存儲各種類型數據。可以存儲諸如Int、Double、String等基本數據類型,也可以存儲其他自定義對象類型,比如自定義的學生Student。 ### map集合4種創建方式 在Kotlin中創建map集合有4種方式,4種方式可以分為兩類,一類是通過構造方法方法創建map集合。另外一種,是通過Kotlin給我們封裝好的方法創建map集合。如下表格,我們將這四種方式列舉了出來。 | 創建map集合方法 | 返回值類型 | 是否可寫| | -------------------------- | ------------- | ------------ | | hashMapOf()方法 | HashMap | 是 | | mapOf方法 | Map | 否 | | mutableMapOf ()方法 | MutableMap | 是 | | TreeMap ()的構造方法 | TreeMap | 是 | 我們可以直接看4種方式的對應方法的方法簽名,重點看返回值,方法體的部分我直接去掉了,對應的源碼如下: ``` //方式一 public fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V> = if (pairs.size > 0) pairs.toMap(LinkedHashMap(mapCapacity(pairs.size))) else emptyMap() //方式二 public fun <K, V> hashMapOf(vararg pairs: Pair<K, V>): HashMap<K, V> = HashMap<K, V>(mapCapacity(pairs.size)).apply { putAll(pairs) } //方式三 public fun <K, V> mutableMapOf(vararg pairs: Pair<K, V>): MutableMap<K, V> = LinkedHashMap<K, V>(mapCapacity(pairs.size)).apply { putAll(pairs) } //方式四 public TreeMap() { comparator = null; } ``` 作為了解,可以通過翻看源碼得知4種創建集合方式上的細微差別,有的是通過Java里面的HashMap創建,有的是通過LinkedHashMap。這個意義不是很大。 更需要知道的是:返回Map不可寫,返回HashMap、MutableMap、TreeMap可寫。具體使用的時候,忘記是否可寫怎么辦?只需要點進去看看方法的返回值即可。或者,看每個方法的注釋,返回只讀的map集合,會出現**read-only map**字樣。比如查看mapof方法的定義,參考截圖: ~~~ /** * Returns a new read-only map with the specified contents, given as a list of pairs * where the first value is the key and the second is the value. * * If multiple pairs have the same key, the resulting map will contain the value from the last of those pairs. * * Entries of the map are iterated in the order they were specified. * * The returned map is serializable (JVM). * * @sample samples.collections.Maps.Instantiation.mapFromPairs */ public fun <K, V> mapOf(vararg pairs: Pair<K, V>): Map<K, V> = if (pairs.size > 0) pairs.toMap(LinkedHashMap(mapCapacity(pairs.size))) else emptyMap() ~~~ 我們通過代碼演示集合的四種創建方式: ~~~ fun main(args: Array<String>) { val map1 = mapOf<String, Int>( Pair("佳佳", 168), Pair("巧巧", 165), Pair("依依", 170), Pair("婷婷", 172), Pair("貝貝", 163) ) println(map1) val map2 = hashMapOf<String, Int>( Pair("佳佳", 168), Pair("巧巧", 165), Pair("依依", 170), Pair("婷婷", 172), Pair("貝貝", 163) ) println(map2) val map3 = mutableMapOf<String, Int>( Pair("佳佳", 168), Pair("巧巧", 165), Pair("依依", 170), Pair("婷婷", 172), Pair("貝貝", 163) ) println(map3) val map4 = TreeMap<String, Int>() map4.put("佳佳", 168) map4.put("巧巧", 165) map4.put("依依", 170) map4.put("婷婷", 172) map4.put("貝貝", 163) println(map4) } ~~~ 運行結果 ``` {佳佳=168, 巧巧=165, 依依=170, 婷婷=172, 貝貝=163} {佳佳=168, 依依=170, 貝貝=163, 巧巧=165, 婷婷=172} {佳佳=168, 巧巧=165, 依依=170, 婷婷=172, 貝貝=163} {佳佳=168, 依依=170, 婷婷=172, 巧巧=165, 貝貝=163} Process finished with exit code 0 ``` 針對上面的代碼。 * 第一,4種方式創建的時候,都指定了map集合中元素的類型。 * 第二,mapOf()、hashMapOf ()、mutableMapOf ()中包含的Pair類型的元素,**都是通過Pair的構造方法創建的。** 如果是通過mapOf()、hashMapOf ()、mutableMapOf ()三個方法創建map集合,而且調用方法的時候,又往map集合中傳入至少一個元素,那么編譯器是可以幫助我們完成map集合中元素類型的自動推斷的,參考代碼: ~~~ fun main(args: Array<String>) { //沒有指定鍵值對類型,類型自動推斷 val map1 = mapOf( Pair("佳佳", 168), Pair("巧巧", 165), Pair("依依", 170), Pair("婷婷", 172), Pair("貝貝", 163) ) println(map1) val map2 = hashMapOf( Pair("佳佳", 168), Pair("巧巧", 165), Pair("依依", 170), Pair("婷婷", 172), Pair("貝貝", 163) ) println(map2) val map3 = mutableMapOf( Pair("佳佳", 168), Pair("巧巧", 165), Pair("依依", 170), Pair("婷婷", 172), Pair("貝貝", 163) ) println(map3) } ~~~ 運行結果 ``` {佳佳=168, 巧巧=165, 依依=170, 婷婷=172, 貝貝=163} {佳佳=168, 依依=170, 貝貝=163, 巧巧=165, 婷婷=172} {佳佳=168, 巧巧=165, 依依=170, 婷婷=172, 貝貝=163} Process finished with exit code 0 ``` mapOf()、hashMapOf ()、mutableMapOf ()中包含的Pair類型的元素,**除了通過Pair的構造方法創建,還可以通過to方法**。我們看to方法的定義如下: ~~~ /** * Creates a tuple of type [Pair] from this and [that]. * * This can be useful for creating [Map] literals with less noise, for example: * @sample samples.collections.Maps.Instantiation.mapFromPairs */ public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that) ~~~ 可以看到是一個帶infix關鍵字的中綴函數。所以,我們創建map的時候,還可以有如下的常用形式,參考代碼: ~~~ fun main(args: Array<String>) { //不使用pair方法,使用to方法更形象 val map1 = mapOf( "佳佳" to 168, "巧巧" to 165, "依依" to 170, "婷婷" to 172, "貝貝" to 163 ) println(map1) val map2 = hashMapOf( "佳佳" to 168, "巧巧" to 165, "依依" to 170, "婷婷" to 172, "貝貝" to 163 ) println(map2) val map3 = mutableMapOf( "佳佳" to 168, "巧巧" to 165, "依依" to 170, "婷婷" to 172, "貝貝" to 163 ) println(map3) } ~~~ 運行結果 ``` {佳佳=168, 巧巧=165, 依依=170, 婷婷=172, 貝貝=163} {佳佳=168, 依依=170, 貝貝=163, 巧巧=165, 婷婷=172} {佳佳=168, 巧巧=165, 依依=170, 婷婷=172, 貝貝=163} Process finished with exit code 0 ``` ### map集合可寫性驗證以及轉換 我們通過代碼驗證集合是否可寫,先驗證集合可寫,參考代碼: ~~~ fun main(args: Array<String>) { val map = hashMapOf(Pair("佳佳", 168)) //寫入 map.put("玲玲", 172) println(map) val map2 = mutableMapOf<String, Int>( "佳佳" to 1, "依依" to 2) //追加元素 map2.put("玲玲", 3) println(map2) } ~~~ 運行結果 ``` {佳佳=168, 玲玲=172} {佳佳=1, 依依=2, 玲玲=3} ``` 我們在驗證集合不可寫,參考代碼: ~~~ fun main(args: Array<String>) { val map = mapOf<String, Int>(Pair("佳佳", 168)) //map.put("玲玲", 172)這里會報錯,無法編譯 println(map) } ~~~ 但是,不可寫集合可以通過toMutableMap轉換為可寫集合,然后在進行寫操作,參考代碼: ~~~ fun main(args: Array<String>) { val map = mapOf<String, Int>(Pair("佳佳", 168)) println(map) //轉換 val mutableMap = map.toMutableMap() //添加 mutableMap.put("玲玲", 172) println(mutableMap) } ~~~ 運行結果 ``` {佳佳=168} {佳佳=168, 玲玲=172} Process finished with exit code 0 ``` ### map集合數據鍵key唯一,值value可重復 參考代碼: ~~~ fun main(args: Array<String>) { val map = mutableMapOf<String, Int>( "佳佳" to 1, "依依" to 2) //追加元素 map.put("小翠", 1) println(map) } ~~~ 運行結果 ``` {佳佳=1, 依依=2, 小翠=1} ``` ### map集合遍歷操作 前面我們學習了區間的遍歷,數組的遍歷。那如何遍歷map集合呢?map集合的遍歷和數組的遍歷一樣。 也就是map集合在遍歷的時候,可以普通的for循環,還可以for循環的時候調用withIndex方法,參考代碼: ~~~ fun main(args: Array<String>) { val map = mapOf<String, Int>( "佳佳" to 168, "巧巧" to 165, "依依" to 170, "婷婷" to 172 ) println("--------直接遍歷map--------") for (entry in map) { println("${entry.key}->${entry.value}") } println("--------遍歷map.entries--------") for (entry in map.entries) { println("${entry.key}->${entry.value}") } println("--------遍歷map的keys--------") for (key in map.keys) { println(key) } println("--------遍歷map的values--------") for (value in map.values) { println(value) } println("--------解構申明--------") for ((key, value) in map) { println("$key->$value") } } ~~~ 運行結果 ``` --------直接遍歷map-------- 佳佳->168 巧巧->165 依依->170 婷婷->172 --------遍歷map.entries-------- 佳佳->168 巧巧->165 依依->170 婷婷->172 --------遍歷map的keys-------- 佳佳 巧巧 依依 婷婷 --------遍歷map的values-------- 168 165 170 172 --------解構申明-------- 佳佳->168 巧巧->165 依依->170 婷婷->172 Process finished with exit code 0 ``` 當然,還可以通過迭代器或者高階函數進行遍歷操作。 ### map集合數據無序 同set集合,map集合同樣無序,應該怎么去理解呢?就是我們的Map接口,不保證加入和取出順序一致。但是子接口會做一些保證。 * HashMap內部存儲的時候會根據元素的hashCode排序,元素取出的時候無序。 * LinkedHashMap內部存儲的時候也會根據元素的hashCode排序,但是使用鏈表存儲,元素取出順序和插入順序一致。 * TreeMap 內部存儲按照自然順序對元素排序,但是對開發者不可見。 我們通過例子,演示下,Map集合的無序性: ~~~ fun main(args: Array<String>) { //LinkedHashMap 插入順序 val map1 = mapOf<String, Int>( Pair("J-1-佳佳", 168), Pair("Q-2-巧巧", 165), Pair("Y-3-依依", 170), Pair("T-4-婷婷", 172), Pair("B-5-貝貝", 163) ) println("${map1}") //HashMap無序 val map2 = hashMapOf<String, Int>( Pair("J-1-佳佳", 168), Pair("Q-2-巧巧", 165), Pair("Y-3-依依", 170), Pair("T-4-婷婷", 172), Pair("B-5-貝貝", 163) ) println("${map2}") //LinkedHashMap 插入順序 val map3 = mutableMapOf<String, Int>( Pair("J-1-佳佳", 168), Pair("Q-2-巧巧", 165), Pair("Y-3-依依", 170), Pair("T-4-婷婷", 172), Pair("B-5-貝貝", 163) ) println("${map3}") //TreeMap 自然順序 val map4 = TreeMap<String, Int>() map4.put("J-1-佳佳", 168) map4.put("Q-2-巧巧", 165) map4.put("Y-3-依依", 170) map4.put("T-4-婷婷", 172) map4.put("B-5-貝貝", 163) println("${map4}") } ~~~ 運行結果 ``` {J-1-佳佳=168, Q-2-巧巧=165, Y-3-依依=170, T-4-婷婷=172, B-5-貝貝=163} {Q-2-巧巧=165, Y-3-依依=170, J-1-佳佳=168, T-4-婷婷=172, B-5-貝貝=163} {J-1-佳佳=168, Q-2-巧巧=165, Y-3-依依=170, T-4-婷婷=172, B-5-貝貝=163} {B-5-貝貝=163, J-1-佳佳=168, Q-2-巧巧=165, T-4-婷婷=172, Y-3-依依=170} Process finished with exit code 0 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看