Scala入門隨筆一
1.scala變數有兩種定義方式,一種是用val關鍵字定義的,另一種是用var定義的,val相當於java裡面的final關鍵字,用它定義後的變數,其值不能進行更改,但var則可以。scala可以根據變數值來自動推斷出變數的具體資料型別,也可以由我們自己來顯示的宣告變數值的型別。此外,兩種方式定義的變數必須要進行初始化賦值,否則執行時會報錯。(賦值時也可以通過佔位符“_”進行初始化,但要宣告變數型別,否則會報錯。)通過佔位符進行初始化的String型別變數預設值為null,Int型別變數預設值為0,Float型別變數預設為0.0,Char型別變數預設為?。
2.scala中的資料型別基本上與java相同(byte、short、int、long、float、double、char),但在使用的時候首字母均需要大寫(Byte、Short、Int、Long、Float、Double、Char),因為scala中一切皆物件。
3.lazy關鍵字的作用是可以讓變數在被使用時進行賦值,lazy關鍵字不能修飾var變數,這是為了防止在變數首次使用之前值被修改。
4.物件比較運算操作中,scala不同於java,scala是“內容比較”,而java是“引用比較”。例如比較String型別的物件時,scala使用“==”符號和使用“equals()”方法的作用是相同的,都是內容進行比較,如果要想使用引用比較則需要呼叫“eq()”方法。
5.元組和符號型別也是scala中特殊的型別,元組型別可以是不同型別的值的聚集,還可以將元組內容進行提取對變數進行初始化。符號型別(Symobols)主要起到標識作用。
對4的補充及更正:
這裡要補充說明的是:這個eq()方法我一次在使用時發現它“失效”了。
情況時這樣的:
val s1="Hello"
val s2="Hello"
s1==s2 //結果true
s1.equals(s2) //結果true
s1.eq(s2) //結果true
val s3=new String("Hello")
val s4=new String("Hello")
s3==s4 //結果true
s3.equals(s4) //結果true
s3.eq(s4) //結果false
這裡面我第一感覺是s1.eq(s2)中的eq()方法失效了,不由得虎軀一震,因為說明之前寫的這篇文章可能誤導一些人。所以這裡強調一下,當我們採用val s1=”Hello”建立的s1是一個字串常量,是儲存在靜態儲存區的,採用val s3=new String(“Hello”)建立的s3是一個物件存放在堆區中。
從上面這個圖我們可以看到,兩種不同方式所定義的s1、s2與s3、s4的儲存方式是不同的,s1、s2是指向相同字串常量,所以無論怎麼比較都是內容比較。而後一種定義方式定義 s3、s4實際上是兩個不同的引用,所以對於使用val s1=“Hello”,val s2=“Hello”這種,無論用“==”、“.equals()”、“.eq()”,結果都將是true,而val s3=new String(“Hello”)、val s3=new String(“Hello”),用“==”、“.equals()”是內容比較,結果為true,而“.eq()”是引用比較,結果是false。
總而言之:對定義成物件形式(val s3=new String(“Hello”))的字串變數進行比較時,使用eq()方法才是對引用的比較。