Array(可变的同类对象序列)
Scala里面使用new实例化对象,实例化过程中,可以用值和类型使对象参数化(parameterize)
参数化的意思是:在创建实例的同事完成对它的”设置”。使用值参数化实例通过把值传递给构造器的
圆括号来实现。
scala> val big = new java.math.BigInteger(“12345”)
big: java.math.BigInteger = 12345
def main(args:Array[String]){
val greetString = new Array[String](3)
greetString(0) = "hello"
greetString(1) = ","
greetString(0) = "world!!!"
for(i <- 0 to 2) // (0).to(2)
print(greetString(i))
}
scala中的数组并不需要像java那样val greet:Array[String] = new Array[String](4),
其原因是scala可以自动类型推到,如果用val定义变量,那么这个变量就不能重新赋值,但变量指向
的对象内部却仍可以改变。所以上例子中greetString对象不能被重新赋值成别的数组;它将永远指向初始化
时指定的那个Array[String]实例。但是Array[String]的内部元素始终能被修改。因此数组本身是可以变的。
例如:
val array = new Array[Int](4) //array只能是Int
greetString = array //error 不可以改变对象
greetString(0) = "abc" //true 数组的具体内容是可以改变的。
List(不可变的同类对象序列)也就意味着List的内容不可以变,List的对象不可以变
val twoThree = List(2,3)
val TwoThreeFive = 5 :: twoThree // ===> twoThree.::(5)
println(TwoThreeFive) //List(5,2,3)
"::"发音为:"cons",它可以把新元素组合到现有列表的最前端,然后返回作为执行结果的新列表。
Tuple(元组)
元组也是不可变的,但与列表不同的是,元组可以包含不同类型的元素,例如元组里面可以同时包含Int和String
例如:
//注意:元组对元素的访问是从1开始的。
val pair = (99,”Luftballons”)
println(pair._1) //获得99 _1为访问名,访问的是第一个字段
println(pair._2) //获得Luftballons
为啥元组的访问元素的时候不想列表那样直接pair(0)?
因为列表中的apply方法始终返回的是同样的类型,但是元组里面的是不尽相同的。、
Set(使用集)
不可以变:scala.collection.immutable.Set
var jetSet = Set(“Spark”,”Scala”)
jetSet += “hadoop” // ===> jetSet = jetSet + “hadoop”
println(jetSet)
上面的例子用Set是scala.collection.immutable.Set的伴生对象调用了apply方法,返回了默认的不可变Set的实例。
Scala编译器推断为不可变的Set[String]
val pair = (99,”Luftballons”)
+方法,对于不可变的来说:
+调用将产生一个全新集。
jetSet = jetSet + “hadoop” 生成一个全新集然后重新赋值给jetSet.
可变的:scala.collection.mutable.Set
//要到如import包
import scala.collection.mutable.Set
val moviceSet = Set(“Java”,”C”)
moviceSet += “Sql” // ====> moviceSet.+=(“Sql”)
println(moviceSet)
编译器可以识别出Set()是scala.collection.mutable.Set,对于moviceSet调用了+=方法
Map(映射)
import scala.collection.mutable.Map
treasureMap += (1 -> “Go to island.”)
treasureMap += (2 -> “Find big X on ground.”)
println(treasureMap(2))
1 -> ” ” 实际上调用了 (1).->(“Go to island.”)方法