- GC の対象外
- 配列要素へのインデックスアクセス
$O(1)$ - しかも,メソッド呼び出しではなく演算扱いで超高速
プリミティブと(一次元)配列だけなら JVM の計算速度は C++ と大差ない
scala> val A = Array(7, 1, 4) A: Array[Int] = Array(7, 1, 4) scala> val B = Array(2, 2, 0, 0, 1, 2, 1) B: Array[Int] = Array(2, 2, 0, 0, 1, 2, 1) scala> B.map(A) res0: Array[Int] = Array(4, 4, 7, 7, 1, 4, 1)
scala> A res2: Array[Int] = Array(7, 1, 4) scala> B res3: Array[Int] = Array(2, 2, 0, 0, 1, 2, 1) scala> val C = A compose B C: Int => Int = <function1> scala> C(4) res4: Int = 1
val N = 100 val sc = new Scanner(System.min) val A = Array.fill(N)(sc.nextLong)
- ループ回さなくてもよい
- コレクション扱い
Java で末尾再帰呼び出しするメソッドを使うと,
Exception in thread "main" java.lang.StackOverflowError
- 末尾再帰呼び出し自動最適化
@tailrec
アノテーション
- よくある
int
/long
のまちがい- Java も Scala もコンパイル通る
- Java IDE でも検出できる
- 並行実行するプログラムを書くときに便利
- スレッド分散 < ノード分散
- 配列と比べるととても遅い
- あまり使いたくない
Java と比べて,良い。
- 初期化
- 関数扱い
- Stack overflow しない