序列
列表
- 最重要的序列類型是
List
類,支持在頭部快速添加和移除條目凝颇,不支持隨機訪問潘拱。快速的頭部添加和移除意味模式匹配很順暢拧略。
數(shù)組
- 數(shù)組中保存了一個序列的元素芦岂。并使用從
0
開始的隨機訪問。
- 數(shù)組中保存了一個序列的元素芦岂。并使用從
-
new Array[Int](5)
生成了一個大小為5
的列表垫蛆,其中的每個元素值都為0
禽最。使用array(index)
的方法來進行隨機訪問,是apply
函數(shù)的語法糖袱饭。
-
列表緩沖(list buffer)
-
ListBuffer
是一個可變對象川无,在列表尾部追加元素的時候比較高效,在頭部添加和在尾部添加都是常量時間虑乖∨城鳎可以使用+=
在尾部追加店展,使用+=:
在頭部添加但指,完成構(gòu)造之后,可以使用toList
方法來得到最終的List
彻舰。
數(shù)組緩沖(ArrayBuffer)
- 和
Array
很像佛猛,可以額外的從序列頭部或者尾部進行操作惑芭,所有的Array
操作在ArrayBuffer
中都可以實現(xiàn),不過稍微慢一些继找。隨機訪問偶爾需要線性時間遂跟,需要分配新的數(shù)組來保存緩沖的內(nèi)容。和ListBuffer
一樣,存在于可變包中幻锁。在創(chuàng)建的時候必須給出類型參數(shù)凯亮。
字符串StringOps
- 實現(xiàn)了許多序列方法,在
Predef
中存在從String
到StringOps
的隱式轉(zhuǎn)換哄尔,可以將任何字符串當做序列來處理假消。
集合和映射
Scala
集合類庫同時提供過了可變和不可變兩個版本的集合和映射。
Map.png
Set.png
Set
和Map
這兩個定義出現(xiàn)了多次岭接,當使用Set
或者Map
的時候富拗,默認的是一個不可變的對象,因為在Predef
中定義了Map
和Set
指向的就是不可變包中的伴生對象鸣戴。如果想要使用可變的版本啃沪,需要顯示地做一次引入。
集合
- 集合中不存在重復元素窄锅,使用
==
來檢查任意的兩個元素是否相等创千。seperator=[,/]+
,表示分隔符是指其中的一個元素或者這個元素的多次重復入偷。
- 集合中不存在重復元素窄锅,使用
-
- 常用的集合操作
// 不可變集合 set + 5 set - 3 set ++ List(5,6) set -- List(5,6) Set(1,2,4) & Set(1,2,3,4) 求交集 set.contains(12) Set.empty[String]追驴,創(chuàng)建一個空的集合 // 可變集合 set(1,2,4) += 4 set(1,2,4) -= 4 set(1,2,3) ++= List(2,3,4) set(1,2,3) --= List(1,23,4) set.clear
Map
- 寫值:
map("hello") = 1; map("world") = 2
- 寫值:
-
- 讀取值:
map("hello")
,如果不存在這個key
疏之,就會報錯殿雪,使用map.get("hello")
的話,返回的是Option
類型的值锋爪。
常用的操作 // 不可變集合 val nums = Map(1 -> 2, 3 -> 4) nums + ( 4 -> 5) nums - 4 nums ++ List(( 4 -> 5), (6 -> 7)) nums -- List(( 4 -> 5), (6 -> 7)) nums.contains(1) nums(1) nums.keys nums.keySet nums.values nums.isEmpty // 可變集合 words += (1 -> 3) words -= 1 words ++= List(1-> 3, 4 -> 5) words --= List(1, 4)
- 讀取值:
默認的集和映射
-
mutable.Set
的默認實現(xiàn)類是HashSet
冠摄,mutable.Map
的默認實現(xiàn)類是HashMap
。
-
- 對與不可變集合和映射來說几缭,情況稍微復雜一些。
immutable.Set()
方法返回的類取決與傳入的元素個數(shù)沃呢。對于少于5
個元素的集合年栓,會有專門的特定大小的類與之對應:EmptySet,Set1,Set2,Set3,Set4
,如果元素個數(shù)大于5
薄霜,則使用HashSet
來實現(xiàn)某抓,不可變的映射實現(xiàn)類似,使用的是HashMap
惰瓜。從Set2
中移除一個元素可以得到Set1
否副。
- 對與不可變集合和映射來說几缭,情況稍微復雜一些。
排序的集合和映射
-
Scala
集合類庫提供了SortedSet
和SortedMap
特質(zhì),分別由TreeSet
和TreeMap
實現(xiàn)崎坊。TreeMap
排序的是鍵的順序备禀。具體順序由Ordered
特質(zhì)決定,集合或者映射的鍵的類型必須混入或者能夠被隱式地轉(zhuǎn)換為Ordered
。
可變和不可變集合類之間的選擇
- 在元素不多的情況下曲尸,使用不可變集合通常比可變集合存儲得更緊湊赋续。
- 為了將不可變集合轉(zhuǎn)到可變集或者逆操作,
Scala
提供過了一些語法糖另患。如果發(fā)現(xiàn)a += b
的操作纽乱,a
并不存在+=
操作時,Scala
將試圖將其解讀為a = a + b
昆箕。同樣的理念適用于任何以=
結(jié)尾的方法鸦列。這樣的好處是只需引入可變版本的Map
就可以覆蓋實現(xiàn),避免了大面積上代碼的改動鹏倘。這樣的特殊語法不僅適用于集合薯嗤,也適用于任何值。
- 為了將不可變集合轉(zhuǎn)到可變集或者逆操作,
初始化集合
- 創(chuàng)建和初始化一個集合最常見的方式是將初始元素傳入所選集合的伴生對象的工廠方法中第股,只需要將元素放在伴生對象名后的圓括號中即可应民。
Scala
編譯器會將其轉(zhuǎn)換為伴生對象apply
方法的調(diào)用。編譯器可以通過初始元素的類型來確定集合的類型夕吻。但也可以在創(chuàng)建集合時指定跟編譯器所選的不同類型诲锹。尤其是對可變的集合以及映射。val a = mutable.Set(1,2,3) a += "string"
a
并不會自動轉(zhuǎn)換為Set[Any]
归园,這需要在定義的時候明確指出a
的類型為Any
。因為可變集合和映射實在原來的集合上做修改稚矿,不可變集合是copy
了原來的集合進行了修改庸诱。
轉(zhuǎn)換成數(shù)組或者列表
- 直接使用
toList
或toArray
方法,需要對集合元素做拷貝晤揣,對于大型集合會比較費時桥爽,但一般許多集合本來元素就不多,所以因為拷貝帶來的性能開銷并不高昧识。
- 直接使用
- 可變集合和不可變集合之間的轉(zhuǎn)變:使用
empty
和++
以及++=
操作钠四。
- 可變集合和不可變集合之間的轉(zhuǎn)變:使用
immutable.Set.empty[String] ++ muteSet mutable.Set.empty[Stting] ++= immuteSet
元組
- 元組可以用來定義一些簡單的數(shù)據(jù)結(jié)構(gòu),元組中可以存在不同類型的數(shù)據(jù)跪楞,如果一個類的作用就是存儲不同類型的數(shù)據(jù)缀去,可以使用元組來替代這個類。但如果這個類中的字段存在某種意義的時候最好還是定義為類甸祭,還可以利用編譯器來進行檢查缕碎。