Scala basis variables

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);
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蟆技,隨后出現(xiàn)的幾起案子玩敏,更是在濱河造成了極大的恐慌,老刑警劉巖质礼,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旺聚,死亡現(xiàn)場離奇詭異,居然都是意外死亡眶蕉,警方通過查閱死者的電腦和手機(jī)砰粹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來造挽,“玉大人碱璃,你說我怎么就攤上這事》谷耄” “怎么了嵌器?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谐丢。 經(jīng)常有香客問我嘴秸,道長,這世上最難降的妖魔是什么庇谆? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任岳掐,我火速辦了婚禮,結(jié)果婚禮上饭耳,老公的妹妹穿的比我還像新娘串述。我一直安慰自己,他們只是感情好寞肖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布纲酗。 她就那樣靜靜地躺著衰腌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪觅赊。 梳的紋絲不亂的頭發(fā)上右蕊,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音吮螺,去河邊找鬼饶囚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸠补,可吹牛的內(nèi)容都是我干的萝风。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼紫岩,長吁一口氣:“原來是場噩夢啊……” “哼规惰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泉蝌,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤歇万,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勋陪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贪磺,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年粥鞋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缘挽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呻粹,死狀恐怖壕曼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情等浊,我是刑警寧澤腮郊,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站筹燕,受9級特大地震影響轧飞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撒踪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一过咬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧制妄,春花似錦掸绞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烫幕。三九已至,卻和暖如春敞映,著一層夾襖步出監(jiān)牢的瞬間较曼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工振愿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捷犹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓埃疫,卻偏偏與公主長得像伏恐,于是被迫代替她去往敵國和親孩哑。 傳聞我的和親對象是個(gè)殘疾皇子栓霜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容