Scala Basic Literals
- Integer , Float , Boolean
- Symbol
這個(gè)Symbol變量第一次見,特意花時(shí)間研究一下背传。
Symbol 是Scala中所謂literal類型的一種,literal字面意思為文本台夺,表現(xiàn)為可以直接在代碼中寫為常量值的東西径玖。
Symbol 本質(zhì)上是字符串的再封裝,相同值(名字)的Symbol具有相同的instance颤介,而相同名字(也是值)的字符串并不一定是同一個(gè)instance梳星。
如某字符串反復(fù)出現(xiàn)赞赖,而且值不會(huì)改變,那么冤灾,可以使用Symbol前域,但其實(shí)并不必須,同樣可以使用字符串的變量名稱韵吨。
相比較于String類型匿垄,Symbol類型有兩個(gè)比較明顯的特點(diǎn):節(jié)省內(nèi)存和快速比較。為了理解归粉,讓我們先來了解一下Java中String的intern()方法椿疗。
Oracle的開發(fā)文檔上講解的很詳細(xì):String類內(nèi)部維護(hù)一個(gè)字符串池(strings pool),當(dāng)調(diào)用String的intern()方法時(shí)糠悼,如果字符串池中已經(jīng)存在該字符串变丧,則直接返回池中字符串引用,如果不存在绢掰,則將該字符串添加到池中痒蓬,并返回該字符串對象的引用。執(zhí)行過intern()方法的字符串滴劲,我們就說這個(gè)字符串被拘禁了(interned)攻晒。默認(rèn)情況下,代碼中的字符串字面量和字符串常量值都是被拘禁的班挖,例如:
String s1 = "abc";
String s2 = new String("abc");
//返回true
System.out.println(s1 == s2.intern());
String s2 = new String("abc");
String s3 = new String("abc");
//返回true
System.out.println(s2.intern() == s3.intern());
//返回false
System.out.println(s2 == s3);
在Scala中鲁捏,Symbol類型的對象是被拘禁的(interned),任意的同名symbols都指向同一個(gè)Symbol對象萧芙,避免了因冗余而造成的內(nèi)存開銷给梅。而對于String類型,只有編譯時(shí)確定的字符串是被拘禁的(interned)双揪。Scala測試代碼如下:
val s = 'aSymbol
//輸出true
println( s == 'aSymbol)
//輸出true
println( s == Symbol("aSymbol"))
雖然兩者結(jié)果相同都返回true动羽,但是由于Symbol類型的對象是被拘禁的(interned),任意的同名symbols都指向同一個(gè)Symbol對象渔期,而不同名的symbols一定指向不同的Symbol對象运吓,所以symbols對象之間可以使用操作符==快速地進(jìn)行相等性比較,常數(shù)時(shí)間內(nèi)便可以完成疯趟,而字符串的equals方法需要逐個(gè)字符比較兩個(gè)字符串拘哨,執(zhí)行時(shí)間取決于兩個(gè)字符串的長度,速度很慢信峻。(實(shí)際上倦青,String.equals方法會(huì)先比較引用是否相同,但是在運(yùn)行時(shí)產(chǎn)生的字符串對象盹舞,引用一般是不同的)
Symbol類型一般用于快速比較产镐,例如用于Map類型:Map<Symbol, Data>,根據(jù)一個(gè)Symbol對象隘庄,可以快速查詢相應(yīng)的Data, 而Map<String, Data>的查詢效率則低很多。
Variable Declaration
scala有兩種變量類型磷账,var和val
var myVar : String = "Foo"
var是可變的峭沦。
val myVal : String = "Foo"
val是不可變的贾虽。
當(dāng)你不指示變量類型逃糟,可以使用默認(rèn)。系統(tǒng)自動(dòng)幫你確認(rèn)類型蓬豁。
var myVar = 10;
val myVal = "Hello, Scala!";
scala也支持tuple對象來定義對象绰咽。
val (myVar1: Int, myVar2: String) = Pair(40, "Foo")
val (myVar1, myVar2) = Pair(40, "Foo")
scala class
定義類
import java.io._
#定義類
class Point(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("Point x location : " + x);
println ("Point y location : " + y);
}
}
#main function
object Demo {
def main(args: Array[String]) {
val pt = new Point(10, 20);
// Move to a new location
pt.move(10, 10);
}
}
在scala console中想要執(zhí)行,需要先編譯地粪,在執(zhí)行
\>scalac Demo.scala
\>scala Demo
類的繼承
import java.io._
class Point(val xc: Int, val yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("Point x location : " + x);
println ("Point y location : " + y);
}
}
#location是Point的子類取募。
class Location(override val xc: Int, override val yc: Int,
val zc :Int) extends Point(xc, yc){
var z: Int = zc
def move(dx: Int, dy: Int, dz: Int) {
x = x + dx
y = y + dy
z = z + dz
println ("Point x location : " + x);
println ("Point y location : " + y);
println ("Point z location : " + z);
}
}
object Demo {
def main(args: Array[String]) {
val loc = new Location(10, 20, 15);
// Move to a new location
loc.move(10, 10, 5);
}
}