scala中的集合复习

scala中集合的复习

Map,Set,Array,List

1、它们是不是只有四个

在 Scala 中,集合类并不只有MapSetArray这三种,还有其他一些常用的集合类型,如ListTupleVector等,但MapSetArray确实是比较常用且具有代表性的集合类型。

2、它们有什么关系、区别

【关系】:

MapSetArrayList这四种集合在 Scala 中存在着一定的关系,具体如下:

共同的抽象基类

  • 它们都继承自Traversable特质或其子特质。Traversable特质定义了一些基本的遍历操作,如foreach方法等,这使得它们都具备了可遍历的特性,能够方便地对集合中的元素进行迭代操作。

集合间的转换

  • Map 与 Set:可以通过MapkeySet方法获取其所有键的Set集合,也可以通过toMap方法将包含键值对的Set转换为Map。例如:
val map = Map("key1" -> "value1", "key2" -> "value2")
val keySet: Set[String] = map.keySet
val set = Set(("key3", "value3"), ("key4", "value4"))
val newMap: Map[String, String] = set.toMap
  • Array 与 List:可以使用ArraytoList方法将Array转换为List,也可以使用ListtoArray方法将List转换为Array。例如:
val array = Array(1, 2, 3)
val list: List[Int] = array.toList
val list2 = List(4, 5, 6)
val newArray: Array[Int] = list2.toArray
  • Map 与 List:可以将Map转换为包含键值对的List,例如val mapList: List[(String, String)] = map.toList。反之,也可以将特定格式的List转换为Map,前提是List中的元素是键值对形式且键唯一,如val newMapFromList: Map[String, String] = List(("key5", "value5"), ("key6", "value6")).toMap

函数式编程中的应用

  • 在函数式编程中,这几种集合都可以作为函数的参数或返回值,方便地进行各种数据处理和转换操作。例如,可以使用map函数对ListArray中的每个元素进行相同的操作并返回一个新的集合,也可以使用filter函数对集合中的元素进行筛选等。同样,对于SetMap也可以进行类似的函数式操作,只是操作的具体语义会根据集合的特点有所不同。
val list3 = List(1, 2, 3, 4, 5)
val newList = list3.map(_ * 2)
val set2 = Set(1, 2, 3, 4, 5)
val newSet = set2.filter(_ % 2 == 0)
val map2 = Map("key1" -> 1, "key2" -> 2, "key3" -> 3)
val newMap2 = map2.mapValues(_ * 10)

内存布局与性能特点的关联

  • Array在内存中是连续存储的,这使得它在随机访问元素时具有很高的性能,但在插入和删除元素时性能较差,因为需要移动大量的元素。而List是由节点组成的链表结构,每个节点包含一个元素和指向下一个节点的引用,这种结构使得它在头部插入和删除元素时非常高效,但随机访问元素的性能相对较差。
  • SetMap在 Scala 中通常基于哈希表实现,这使得它们在查找元素时具有较快的速度,但在遍历元素时的顺序是不确定的,与插入顺序无关。

【区别】:

存储特点

  • Map:是一种键值对集合,其中的元素是以键值对的形式存在的,每个键对应一个值,键是唯一的。例如val map = Map("key1" -> "value1", "key2" -> "value2")
  • Set:是一种不包含重复元素的集合。例如val set = Set(1, 2, 3, 4, 4),最终集合中只会保留1, 2, 3, 4这四个元素。
  • Array:是一种长度不可变的数组,存储的元素可以是任意类型,但所有元素的类型必须一致。例如val array = Array(1, 2, 3, 4)
  • List:是一种线性的、不可变的集合,存储的元素可以是任意类型,且允许有重复元素。例如val list = List(1, 2, 3, 4, 4)

元素访问与操作

  • Map:通过键来访问对应的值,例如map("key1")将返回"value1"。可以使用map.keys获取所有键,使用map.values获取所有值,也可以使用map.updated("key1", "newValue1")来更新键对应的值等。
  • Set:可以使用set.contains(1)来判断集合中是否包含元素1,也可以使用set + 5向集合中添加元素5,不过由于Set的不重复性,若添加的元素已存在,则集合不变。
  • Array:通过索引来访问元素,例如array(0)将返回数组中的第一个元素1。数组的长度是固定的,若要修改元素,可以直接对相应索引位置的元素赋值,如array(0) = 10
  • List:可以使用list.head获取列表的第一个元素,使用list.tail获取除第一个元素之外的剩余列表。由于List是不可变的,若要添加元素,可以使用1 :: list将元素1添加到列表头部,得到一个新的列表。

性能特点

  • Map:查找元素的时间复杂度接近常数时间,取决于哈希函数的性能。在有大量数据且需要频繁根据键查找值的场景下性能较好。
  • Set:判断元素是否存在的操作效率较高,同样依赖于哈希实现的Set查找时间复杂度接近常数时间。适合用于快速判断元素是否属于某个集合的场景。
  • Array:随机访问元素的速度非常快,时间复杂度为 O (1),因为数组在内存中是连续存储的,可以通过索引直接定位到元素。但插入和删除元素的效率较低,因为需要移动大量后续元素。
  • List:头部添加和删除元素的操作非常快,时间复杂度为 O (1),但随机访问元素的效率较低,需要遍历列表来查找元素,时间复杂度为 O (n)。

适用场景

  • Map:常用于需要根据特定键来存储和查找数据的场景,如存储用户信息,以用户 ID 为键,用户详细信息为值;或者用于表示配置信息等。
  • Set:适用于需要保证元素唯一性的场景,如存储一组不重复的标签、去重后的数据集等。
  • Array:适合存储和操作固定大小、类型相同的数据集合,特别是在需要高效随机访问元素的场景下,如存储矩阵数据、图像像素数据等。
  • List:在需要频繁在头部添加或删除元素,以及对序列进行递归处理的场景中比较适用,如实现栈、队列等数据结构,或者处理自然顺序的元素序列等。

你可能感兴趣的:(scala,开发语言,后端)