Kotlin數(shù)據(jù)容器深入講解
前言
容器是用于存放數(shù)據(jù)的載體。容器分為數(shù)組、集合。 Kotlin 作為一門全新的語言,肯定還是要有自己的容器類,不然哪天 Java 跟 Kotlin 劃清界限,那麻煩就大了。 Kotlin 也擁有三類基本的容器,分別是集合 Set、隊(duì)列 List、映射 Map,每種 容器又分作只讀與可變兩種類型這是為了判斷該容器能否進(jìn)行增刪改等變更操作。
• Kotlin 數(shù)組
• Kotlin 集合
一、Kotlin數(shù)組
數(shù)組是一種初始化時(shí)指定容器大小,不可以動(dòng)態(tài)調(diào)整其大小的容器。元素按 順序存儲(chǔ)在一串連續(xù)的內(nèi)存段上。
1、Kotlin數(shù)組創(chuàng)建技巧
arrayOf 創(chuàng)建數(shù)組
創(chuàng)建一個(gè)數(shù)組并傳遞元素值給它, 集合中的元素可以是任意類型
val array = arrayOf(1, 2, 3) val array = arrayOf(1, true, "2", JSONObject()) // 集合中的元素可以是任意 類型
arrayOfNulls 創(chuàng)建數(shù)組
創(chuàng)建一個(gè)指定大小的、所有元素都為空的數(shù)組,但必須指定集合中的元素類型
val arrayOfNulls = arrayOfNulls<String>(5) //創(chuàng)建一個(gè)指定大小的、所有元素 都為空的數(shù)
動(dòng)態(tài)創(chuàng)建數(shù)組
用接受數(shù)組大小以及一個(gè)方法參數(shù)的 Array 構(gòu)造方法,用作參數(shù)的方法能夠 返回給定索引的每個(gè)元素初始值:
// 創(chuàng)建一個(gè) Array<String> 初始化為 ["0", "1", "4", "9", "16"]
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }2、原生類型數(shù)組
在 Kotlin 中也有無裝箱開銷的專門的類來表示原生類型數(shù)組:


IntArray 函數(shù)
// 1.創(chuàng)建并初始化一個(gè) IntArray [1, 2, 3, 4, 5]
val intArray = IntArray(1, 2, 3, 4, 5)
// 2.創(chuàng)建一個(gè)長(zhǎng)度為 5 的空的 IntArray
val intArray2 = IntArray(5)
// 3.創(chuàng)建一個(gè)長(zhǎng)度為 5 的值全為 100 的 IntArray [100, 100, 100, 100, 100]
val intArr2 = IntArray(5) { 100 }
// 4.注意這里 it 是它索引下標(biāo)值,所以這是創(chuàng)建一個(gè)長(zhǎng)度為 5 的 IntArray [0, 2, 4,
6, 8]
val intArr3 = IntArray(5) { it * 2 Tips
在 Kotlin 數(shù)組類型不是集合中的一種,但是它又和集合有著太多相似的地 方。 數(shù)組和集合可以互換初始化集合的時(shí)候可以傳入一個(gè)數(shù)組
3、數(shù)組常見的操作

獲取元素
val array =arrayOf(1,2,3,4,5) array[index] // 獲取數(shù)組的第 index 個(gè)元素,下標(biāo)從 0 開始 array.component1() … arr.component5()獲取數(shù)組的前 5 個(gè)元素。同樣適用于集合
for 循環(huán)——元素遍歷
for (item in array) { // 元素遍歷
println(item)
//1
//2
//3
//4
//5
}for 循環(huán)——下標(biāo)遍歷
for (i in array.indices) { // 根據(jù)下標(biāo)再取出對(duì)應(yīng)位置的元素
println(i.toString() + "->" + array[i])=
//0->1
//1->2,
//2->3,
//3->4,
//4->5
}forEach 遍歷數(shù)組
array.forEach {
println(it)
//1
//2
//3
//4
//
}forEach 增強(qiáng)版
array.forEachIndexed { index, item ->
println("$index:$item")
//0:1
//1:2
//2:3
//3:4
//4:5
}數(shù)組翻轉(zhuǎn)
array.reverse() >> println(array) = 5,4,3,2,1
二、Kotlin集合
Kotlin 標(biāo)準(zhǔn)庫提供了一整套用于管理集合的工具,集合是可變數(shù)量(可能為 零)的一組條目,各種集合對(duì)于解決問題都具有重要意義,并且經(jīng)常用到。 與數(shù)組不同的是可變集合的大小可以動(dòng)態(tài)改變。
• List: 是一個(gè)有序集合,可通過索引(反映元素位置的整數(shù))訪問元 素。元素可以在 list 中出現(xiàn)多次。列表的一個(gè)示例是一句話:有一組 字、這些字的順序很重要并且字可以重復(fù)。
• Set: 是唯一元素的集合。它反映了集合(set)的數(shù)學(xué)抽象:一組無重 復(fù)的對(duì)象。一般來說 set 中元素的順序并不重要。例如,字母表是字 母的集合(set)。
• Map:(或者字典)是一組鍵值對(duì)。鍵是唯一的,每個(gè)鍵都剛好映射到 一個(gè)值,值可以重復(fù)。
1、集合創(chuàng)建的技巧
集合分為
可變集合,顯而易見,是指集合創(chuàng)建完成之后,可以對(duì)集合進(jìn)行增 刪改查操作
不可變集合,顯而易見,是指指集合創(chuàng)建完成之后,不能對(duì)集合進(jìn)行增刪改 查操作,會(huì)拋異常。

List 隊(duì)列
隊(duì)列是一種元素之間按照順序排列的容器,它與集合的最大區(qū)別,便是多了 個(gè)次序管理。不要小看這個(gè)有序性,正因?yàn)殛?duì)列建立了秩序規(guī)則,所以它比 集合多提供了如下功能(注意凡是涉及到增刪改的,都必須由 MutableList 來 完成):
• 不可變集合
val strings = listOf("one", "two", "one") // 不可以對(duì) strings 進(jìn)行增刪改查操作• 可變集合
val numbers = mutableListOf<Int>(1, 2, 3, 4) // 可以對(duì) numbers 進(jìn)行增刪改查 操作 val numbers = arrayListOf<Int>(1, 2, 3
Tips
不難發(fā)現(xiàn),每個(gè)不可變集合都有對(duì)應(yīng)的可變集合,也就是以 mutable 為前綴 的集合。
• 不可變的 List 類型集合的初始化使用:listOf 函數(shù)
• 可變的 List 類型集合的初始化使用:mutableListOf 函數(shù)
Set 集合
1、容器內(nèi)部的元素不按順序排列,因此無法按照下標(biāo)進(jìn)行訪問;
2、容器內(nèi)部的元素存在唯一性,通過哈希值校驗(yàn)是否存在相同的元素,如果 存在則覆蓋之;
• 不可變集合
val hello = setOf("H", "e", "l", "l", "o")//自動(dòng)過濾重復(fù)元素
>> println(hello) = H", "e", "l","w", "o"• 可變集合
val hello = mutableSetOf("H", "e", "l", "l", "o") //自動(dòng)過濾掉重復(fù)元素
>> println(hello) = H", "e", "l","w", "o", "r", "l", "dTips
• 不可變的 set 類型集合的初始化使用:setOf 函數(shù)
• 可變的 set 類型集合的初始化使用:mutableSetOf 函數(shù)
Map 字典
映射內(nèi)部保存的是一組鍵值對(duì)(Key-Value),也就是說,每個(gè)元素都由兩部 分構(gòu)成,第一部分是元素的鍵,相當(dāng)于元素的名字;第二部分是元素的值, 存放著元素的詳細(xì)信息。元素的鍵與值是一一對(duì)應(yīng)的關(guān)系,相同的鍵名指向 的值對(duì)象是唯一的,所以映射中每個(gè)元素的鍵名各不相同,這個(gè)特性使得映射的變更操作與隊(duì)列存在以下不同之處(注意增刪操作必須由 MutableMap 來完成):
• 不可變集合
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to
1)
>> println("${numbersMap.keys}")= key1,key2,key3,key4
>> println("${numbersMap.values}") = 1,2,3,1• 可變集合
val numbersMap = mutableMapOf("key1" to 1, "key2" to 2, "key3" to 3,
"key4" to 1)
>> println("${numbersMap.keys}")= key1,key2,key3,key4
>> println("${numbersMap.values}") = 1,2,3,1Tips
• 不可變的 map 類型集合的初始化使用:mapOf 函數(shù)
• 可變的 map 類型集合的初始化使用:mutableMapOf 函數(shù)
2、集合的操作

增刪改查
val stringList = listOf("one", "two", "one") 以 list 集合為例,set,map 同樣
具備以下能力
numbers.add(5) // 集合最后面添加元素 5
numbers.addAt(1,5) // 向下標(biāo)為 1 的位置,添加元素 5,下標(biāo)為 1 及之后位置的
元素,以此后移
numbers.remove("one") // 刪除元素“one”
numbers.removeAt(1) // 刪除下標(biāo)為 1 的元素
numbers.set(0) = 0 // 下標(biāo)為 0 的元素設(shè)置為 0
numbers.get(0)==>1 // 獲取下標(biāo)為 0 的元素,結(jié)果為 變換操作
在 Kotlin 中提供了強(qiáng)大對(duì)的集合排序的 API,讓我們一起來學(xué)習(xí)一下:

到此這篇關(guān)于Kotlin數(shù)據(jù)容器深入講解的文章就介紹到這了,更多相關(guān)Kotlin數(shù)據(jù)容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android打印機(jī)--小票打印格式及模板設(shè)置實(shí)例代碼
這篇文章主要介紹了Android打印機(jī)--小票打印格式及模板設(shè)置實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
詳解Android PopupWindow怎么合理控制彈出位置(showAtLocation)
本篇文章主要介紹了詳解Android PopupWindow怎么合理控制彈出位置(showAtLocation),具有一定的參考價(jià)值,有興趣的可以了解一下2017-10-10
Android游戲開發(fā)學(xué)習(xí)②焰火綻放效果實(shí)現(xiàn)方法
這篇文章主要介紹了Android游戲開發(fā)學(xué)習(xí)②焰火綻放效果實(shí)現(xiàn)方法,以實(shí)例形式詳細(xì)分析了Android中粒子對(duì)象類Particle類和粒子集合類ParticleSet類及物理引擎ParticleThread類 的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android 自定義組件衛(wèi)星菜單的實(shí)現(xiàn)
這篇文章主要介紹了Android 自定義組件衛(wèi)星菜單的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07
Android編程實(shí)現(xiàn)開機(jī)自動(dòng)運(yùn)行的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)開機(jī)自動(dòng)運(yùn)行的方法,分析了Android開機(jī)運(yùn)行的原理并結(jié)合實(shí)例形式給出了Android基于廣播實(shí)現(xiàn)開機(jī)運(yùn)行的技巧,需要的朋友可以參考下2016-10-10

