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,类构造方法@BeanProperty  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不可读和写)

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){}
        }
    }
}

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]

  快学课后习题答案

时间: 2024-10-07 15:29:50

Scala快学笔记(二)的相关文章

[Scala] 快学Scala A2L2

集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快速访问任意元素.但是链表不可以. Set是一组没有先后次序的值.SortedSet中,元素排过序. Map时一组(键,值)对.SortedMap按键排序 每一个Scala集合特质或类都有一个带有apply 方法的伴生对象. 13.2 可变和不可变集合 13.3 序列Sequence 不可变序列:In

快学Scala-第二章 控制结构和函数

知识点: 1.条件表达式 if(x>0) 1 else 0 scala每个表达式都有一个类型,如果一致则为它们的类型,如果为混合类型表达式,则为它们的公共超类型Any. if(x>0) 1 可能没有输出值,在scala中,每个表达式都应该有某种值,引入Unit类,写作(). if(x>0) 1 等同于 if(x>0) 1 else () 2. 语句终止,如果在写较长的语句,需要分两行来写的话,就要确保第一行以一个不能用作语句结尾的符号结尾,通常用操作符. 3.块表达式和赋值,块中最

快学scala 第十一章 操作符 读书笔记及习题答案代码

chapter 11 操作符 标签:快学scala 一.笔记 scala种可以在反引号中包含几乎任何字符序列, val 'val' = 42 所有的操作符都是左结合的,除了以冒号(:)结尾的操作符,和赋值操作符.用于构造列表的::操作符是又结合的.1::2::Ni1的意思是1::(2::Ni1),先创建出包含2的列表,这个列表又被作为尾巴拼接到以1作为头部的列表中. 2. 函数调用语法:f(arg1, arg2,...)扩展到可以应用于函数之外的值,如果f不是函数或方法,那么这个表达式等于f.a

快学scala笔记.

第一章 基础 val 定义的值实际上是一个常量 var 声明其值可变的变量 val xmax,ymax = 100 var greeting,message: String = null 1.3 常用类型 Scala的7种数值类型:Byte.Char.Short.Int.Long.Float和Double 1.toString() 2.to(10) "Hello".intersect("World") 1.4 算术和操作符重载 val answer = 8 * 5

快学Scala 第十九课 (trait的abstract override使用)

trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super.log依旧是个abstract class,所以必须在方法前加上abstract和override.但是并没有具体介绍如何使用,然后查阅了其他文档,才明白使用方法. 下面的代码定义了超类LoggerEmpty,这个定义意味着该特质只能混入扩展LoggerEmpty的类中. 在特质中声明抽象方法中有

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

快学Scala课后习题答案

分享一个之前做快学Scala的课后习题(2-21章节,19无)的Github链接,我把习题的文字写在了每个回答的注释上面,这样方便大家对照着看,省的回过头去对照着pdf看了,如果有做的不对的地方希望大家给予指正. 链接如下,http://github.com/fxxkinglife/scala-hello. 举一个第二章节的例子, object charpter02 { /* * 2.1 * 一个数字如果为正数,则它的signum为1; * 如果是负数,则signum为-1; * 如果为0,则s

快学Scala习题解答—第一章 基础

1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on the Java Virtual Machine>好很多. 是本不错的入门书.而且每个章节都设置了难度级别,每章有习题,可以巩固Scala语法. 本文的目的就是针对这些习题进行解答 2 基础 2.1 在Scala REPL中键入3,然后按Tab键.有哪些方法可以被应用? 这个....直接操作一遍就有结果了.

Emacs 笔记二

Emacs 笔记二 Table of Contents 1. 前言 2. emacs基本操作(常用快捷键) 3. emacs模式讲解 4. emacs缓冲区 5. org mode 5.1. 列表 5.2. 快键键 5.3. 内嵌元素(插入代码什么的) 5.4. 表格 1 前言 最近在学着写博客,发现MarkDown真乃神器,于是去找了很多markdown的工具,发现作业部落 最好的那个,而无意间又发现了org-mode火爆到极致 非常被人推崇,其实作业部落 已经是能很完美的满足我的需求了,但是