Map集合有两种类型,可变的与不可变的,区别在于可变对象可以修改,而不可变对象不可以修改。默认情况下Scala使用不可变Map集合,如果需要使用可变Map集合,则需要显式地使用import导入包。在Scala中,可以同时使用可变与不可变的Map集合,不可变的直接使用Map,可变的使用mutable.Map。
1.1Scala的Map继承关系
HashMap基于哈希表实现可变的版本,基于HashTrie实现不可变版本,与HashSet相似。WeakHashMap相当于一个弱引用的Map,当内存空间不足时,可以释放垃圾、回收空间。SortedMap和TreeMap只提供了不可变版本,SortedMap与SortedSet相似, TreeMap同样也是基于红黑树实现的。LinkedHashMap只提供可变的版本,保持插入集合元素的顺序不变,它也是基于哈希表实现的。ListMap有可变的和不可变的版本,与LinkedHashMap相反。
Map集合中有一个对应的SychronzedMap,Set和Seq中也有类似的方法,该方法中有很多分支。 SychronzedMap使用多线程,保证线程安全。在多线程开发时,如果要保证线程的安全,可以选择以Sychronzed开头的集合。
1.Scala的Map概述
Map(映射)是一种可迭代的键值对(Key/Value)结构,所有值都可以通过键来获取,Map中的键都是唯一的。定义Map时,需要为键值对定义类型。
1.Scala的Map的定义
在Java中,Map是以键对(K,V)的形式存在的,例如(Key1,V1)。在Scala中,Map集合同样是以键值对的方式存在的,应用非常广泛。
2.Scala的Map的创建
在Scala中,有两种创建Map的方式,分别是Map(k1->v1,k2->v2,..和Map((k1,v1),(k2,v2),...。 Map(k1->v1,k2->v2,...中的k1->v1表示第一个元素,k2->V2表示第二个元素。第二种方式Map((k1, v1),(k2,v2)...是通过元组的方式定义的。
3.Scala的Map的分类
Scala的Map有两种类型,即可变的和不可变的,这在之前介绍过。上述创建Map的方式是不可变的, 如果想创建可变的Map,需要导入指定的包,创建方式与不可变的方式相同。
1.3 Scala的可变Map常用操作
Scala的可变Map常用操作有增加、删除、修改、查询等,如表8-2所示。向Map中添加元素,可以直接使用M(k)-V的形式向集合中添加一个键值对。例如,定义一个Map集合,val m=Map(K1-2V1,K2-V2),通过m(K3)=V3向m中添加一个键值对。如果添加的K值存在,会使用新的V替换集合中原有的V值。
另外,put方法也可以使用(K,V)的形式添加,例如 put(K,V),并返回一个option类型。十=用于添加一个键值对;++=用于添加一个集合。删除操作中的Remove方法会根据K指定的值进行删除, 例如,remove(K1)表示删除与K1对应的V值。调用clear 方法会把元素清空。调用retain(方法可以根据0中表达式为真或假,判断是否保留元素。更新操作与Java 中非常相似,通过M(k)=v的形式进行更新。
查询操作有两种方式,分别是Get(key)和m(key)。通过m(key)方式中的key会返回对应的V值, 如果不是对应的值,则会抛出异常。如果不想抛出异常,可以使用Get(key)的方式。如果K和V不对应, 则会返回None。提倡使用Get(key)的方式查询值,这样不会影响整体代码的执行效率。
相关代码如下:
Scala
//可变的Map,要导入包
import scala.collection.mutable
//类型:可变
//操作:添加元素,删除元素,查询元素,修改元素,遍历
object mutable_map {
def main(args: Array[String]): Unit = {
// 可变Map
val map1 = mutable.Map("鄂" -> "湖北省", "湘" -> "湖南省", "青" -> "青海")
//1.添加
map1 += ("豫" -> "河南省")
//2.删除。只需要提供key
//map1 -= "鄂"
//3.查询
//3.1 get方法。输入key,如果找到,就返回包装数据,如果没有找到,就返回None
//3.2 直接:map(key名)。如果key不存在,就会报错!
// val rs = map1.get("鄂")
// println(rs.get)
println(map1("鄂"))
//4.修改元素:把 青->青海,改成 青->青海省
map1("青") = "青海省"
//5.遍历
//5.1 for
//5.2 foreach
for ((key, value) <- map1) {
println(s"$key 是 ${value} 的简称")
}
map1.foreach { case (key, value) => {
println(s"$key 是 ${value} 的简称")
}
}
}
}
1.4 Scala的不可变Map常用操作
由于是不可变Map,所以不可以进行更新操作。添加、 删除、查询和遍历操作与之前介绍的操作方法相同,这里不再详细说明。
下面举例说明映射的增加、删除、修改和查询等操作。
相关代码如下:
Scala
//类型:不可变,可变
//操作:添加元素,删除元素,查询元素,修改元素,遍历
object map {
def main(args: Array[String]): Unit = {
//不可变Map
val map1 = Map("鄂" -> "湖北省", "湘" -> "湖南省")
//1.添加
val map2 = map1 + ("豫" -> "河南省")
//如果key存在,就是修改
// val map3 = map1 + ("鄂"->"河南省")
//2.删除。只需要提供key
val map3 = map1 - "鄂"
//3.查询
//3.1 get方法。输入key,如果找到,就返回包装数据,如果没有找到,就返回None
//3.2 直接:map(key名)。如果key不存在,就会报错!
// val rs = map1.get("鄂")
// println(rs.get)
// println(map1("鄂1"))
//4.修改元素:把 青->青海,改成 青->青海省
// map1("青") = "青海省"
val map4 = map1 + ("青" -> "青海省 ")
//5.遍历
//5.1 for
//5.2 foreach
for ((key, value) <- map1) {
println(s"$key 是 ${value} 的简称")
}
// map1.foreach{case (key,value) => {
// println(s"$key 是 ${value} 的简称")
// }}
}
}