Scala快學筆記(二)
一,基本概念
1,映射
Map與HashMap與TreeMap,SotredMap等區別:
1、HashMap鍵無序,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,在Map 中插入、刪除和定位元素,HashMap 是最好的選擇;
2、LinkedHashMap 是HashMap的一個子類,鍵保存了插入的順序,使用Iterator遍歷時,得到的也是插入順序的記錄;
3、TreeMap默認按鍵的升序排序,可以定制。
4、HashTable 線程安全,鍵不能為null,與HashMap類似,但效率較低,HashMap如果需要實現同步,可以使用Collections. synchronizedMap或ConcurrentHashMap 。
課後習題4.2
/* 編寫一段程序,從文件中讀取單詞。用一個可變映射來清點每個單詞出現的頻率。讀取這些單詞的操作可以使用java.util.Scanner: */ //method1 val in=new java.util.Scanner(new java.io.File("/home/user/people.txt")) val map=new HashMap[String,Int] while (in.hasNext()){ map(in.next())=map.getOrElse(i,0)+1 } map //method2 val file=scala.io.Source.fromFile("/home/usr/people.txt").mkString val tokens=file.split("\\s+") //\\s表示 空格,回車,換行等空白符,+號表示一個或多個的意思, val map=scala.collection.mutable.HashMap[String,Int] for (word <- tokens) map[word]=map.getOrElse(word,0)+1 map
課後習題4.7
/*按格式打印出出所有Java系統屬性的表格*/ import scala.collection.JavaConversions.propertiesAsScalaMap val props:scala.collection.Map[String,String]=System.getProperties() val keys=props.keySet val keyLength=for (key <- keys) yield(key.length) val maxKeyLength=keyLength.max for ((k,v) <- props){ print(k) print(" "*(maxKeyLength-k.length)) print("|") println(v) }
二,類與對象
1,針對方法,帶()多指改變了對象狀態方法,而不帶只是簡單的讀取
2,[email protected] var name:String=_: 內部類和 外部類可以調用getName()和setName()方法 加private時,只有內部類可以
2.2 主構造函數法:class People(val name:String,private var age:Int) name能被內部類和外部對象讀取,age 能在內部類中讀寫,但不被外部訪問
1,class Peo(private val name:String) val p=new Peo("z") p.<tab> asInstanceOf isInstanceOf toString (無name不可讀和寫) ,2,class Peo(val name:String) val p=new Peo("z") p.<tab> asInstanceOf isInstanceOf name toString (name屬性可讀) 3,class Peo( var name:String) val p=new Peo("z") p.<tab> asInstanceOf isInstanceOf name name_= toString (name,可讀和可寫) 4,class Peo( private var name:String) val p=new Peo("z") p.<tab> asInstanceOf isInstanceOf toString (無name不可讀和寫)View Code
2,靜態方法和非靜態方法區別:
首先,兩者本質上的區別是:靜態方法是在類中使用staitc修飾的方法,在類定義的時候已經被裝載和分配。而非靜態方法是不加static關鍵字的方法,在類定義時沒有占用內存,只有在類被實例化成對象時,對象調用該方法才被分配內存。
其次,靜態方法中只能調用靜態成員或者方法,不能直接調用非靜態方法或者非靜態成員(可以聲明對象來調用),而非靜態方法既可以調用靜態成員或者方法又可以調用其他的非靜態成員或者方法。
3,多維組使用:val arr=Array.ofDim(3) 出錯,必須為多維數組指定類型 val arr=Array.ofDim[String](3) arr=Array(3) 和arr=new Array(3)有區別
4,枚舉類型:在Scala中並沒有枚舉類型,但在標準類庫中提供了Enumeration類來產出枚舉。擴展Enumeration類後,調用Value方法來初始化枚舉中的可能值 (黏貼用:paste, 對象時object)
object ExecutorState extends Enumeration{ type ExecutorState = Value val LAUNCHING, LOADING, RUNNING, KILLED, FAILED, LOST, EXITED = Value def isFinished(state:ExecutorState):Boolean = { Seq(KILLED, FAILED, LOST, EXITED).contains(state) } }
5,包
package com.hostname.impatient :子類不能引用父類的類 package com{ class T1{} package hostname{ class T2(t1:T1){} package impatient{ class T3(t1:T1,t2:T2){} } } }View Code
5.1 private[com] def giveRaise(rate:Double) 表示除com外其它都不可訪問
5.2 scalac 編譯文件生class scala class 將文件解析為機器可執行文件
5.3 object test extends App{ } 可以用以測試
6,繼承
6.1 重寫與重載()
重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數的區分標準
1,(override)重寫方法不能比被重寫方法限制有更嚴格的訪問級別,即父類的訪問權限(private)低於子類的訪問權限(public)
2,參數列表必須與被重寫方法的相同;返回類型必須與被重寫方法的返回類型相同;如果一個方法不能被繼承,則不能重寫它;不能重寫被標識為final的方法。
3,重寫方法不能拋出新的異常或者比被重寫方法聲明的檢查異常更廣的檢查異常。但是可以拋出更少,更有限或者不拋出異常。
4,重寫抽象類的方法,就不用使用override,直接使用def ...
6.2 類型檢查 a.asInstanceOf[Employee]
快學課後習題答案
Scala快學筆記(二)