scala知识点

1.什么是scala语言?

Scala 是一种多范式的编程语言,函数式编程语言。其设计的初衷是要集成面向 对象编程和函数式编程的各种特性。Scala 运行于 Java 平台 (Java 虚拟机),并兼容现有的 Java 程序。、
多范式编程语言包括:面向对象编程、函数式编程和泛型编程

2.Scala 特性?

  • 面向对象特性
  • 函数式编程
  • 静态类型
  • 扩展性
  • 并发性

3.函数式编程特点?

  • 闭包和高阶函数
  • 惰性计算
  • 递归
  • 函数是"第一等公民"
  • 只用"表达式",不用"语句"
  • 没有"副作用"
  • 不修改状态
  • 引用透明性

4.scala 数据类型?

  • Byte 8位有符号补码整数。数值区间为 -128 到 127
  • Short 16位有符号补码整数。数值区间为 -32768 到 32767
  • Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
  • Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
  • Float 32 位, IEEE 754 标准的单精度浮点数
  • Double 64 位 IEEE 754 标准的双精度浮点数
  • Char 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
  • String 字符序列
  • Boolean true或false
  • Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
  • Null null 或空引用
  • Nothing Nothing类型在Scala的类层级的最底端;它是任何其他类型的子类型。
  • Any Any是所有其他类的超类
  • AnyRef AnyRef类是Scala里所有引用类(reference class)的基类

5.scala 变量声明,使用?区别?

var:变量
val:常量,如果不改变的话建议使用val

6.块语句有什么特点?

语句块就是: {}
特点是把最后一个值或者表达式 当做返回值

7.scala break怎么使用?

先导包,在创建对象

// 导入以下包
import scala.util.control._

// 创建 Breaks 对象
val loop = new Breaks;

// 在 breakable 中循环
loop.breakable{
    // 循环
    for(...){
       ....
       // 循环中断
       loop.break;
   }
}

这里我们对比java 中 break return ?

  • break: 此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),即,不是跳到下一个循环周期而是退出循环。如果break语句包含在嵌套循环里,它只跳出最里面的循环。
  • continue:循环语句里有此语句时,程序运行到此语句时,不在执行循环体里continue后面的语句而是跳到下一个循环入口处执行下一个循环。
  • return是表示直接结束此方法

8.方法和函数有什么区别?

1.方法不能作为单独的表达式而存在(参数为空的方法除外),而函数可以。如:
2.函数必须要有参数列表,而方法可以没有参数列表
3.方法名是方法条用,而函数名只是代表函数对象本身
4.在需要函数的地方,如果传递一个方法,会自动进行ETA展开(把方法转换为函数)
5.传名参数本质上是个方法

9.lazy 特点?

lazy:懒加载,延迟操作, 只有被调用的时候才会被执行

10.数组可变不可变?

可变不可变指的是:数组的长度
Array:长度不可变,元素可变
ArrayBuffer:可变

11.list 可变不可变?

可变不可变指的是: 里面的元素
使用时要导包

scala.collections.multiple.ListBuffer

list:不可变
listBuffer:可变

list 添加元素: ++ :+ +: :: .+: .+: :::
list 添加元素分为:左边添加和右边添加

12.scala 的集合有哪些?

list set map seq

13.map 可变不可变?

可变不可变指的是: K V 值能不能被改变
创建的方式有两种: 映射 -> 元组(,)

14.zip 操作?

zip: 拉链操作 。数组、元组和集合都可以用

(1,2,3).zip(1,2,3)
结果为
((1,1),(2,2),(3,3))

15.tuple 元组?

tuple 特殊元组:对偶元组 ,只有两个元素的元组

16.hashSet hashMap

HashMapHashSet
HashMap实现了Map 接口HashSet实现了Set接口
HashMap储存键值对HashSet仅仅存储对象
使用put0方法将元素 放入map中使用add0方法将元素放入set中
HashMap中使用键对现象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals0方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一-的键来HashSet较HashMap来说比较慢

17.HashMap HashTable 区别

默认容量不同。扩容不同
线程安全性,HashTable 安全
效率不同 HashTable 要慢因为加锁

18.Option 有两个子类? map

Option 有两个子类:Some(vaule)和None
Some(vaule)获取值的方法是get(key)

19.scala 访问修饰符? 作用域?

  • public :公共
  • private :私有的
  • protect
  • private[this]
  • protect[this]

20.scala 如何访问内部类?

1.外部类暴露内部类对象
2.new 外部类对象.内部类

21.伴生类和伴生对象? 3个要点

表中的单例对象被叫做 ChecksumAccumulator ,与前一个例子里的类同名。当单例对象与
某个类共享同一个名称时,他被称作是这个类的 伴生对象:companion object。你必须在
同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的 伴生类:companion
class。类和它的伴生对象可以互相访问其私有成员
1.名字一样
2.同一个scala文件
3.类和它的伴生对象可以互相访问其私有成员

22.App特质?

scala的一个特质 可以代替main方法 作为程序的入口

23.scala 构造器?

主构造器,辅助构造器 辅助构造器第一句必须要调用主构造器

24.scala object类型?

scala 没有静态类型 static
object 里面的属性和方法都是静态的
object 修饰的 都是单例的

25.apply应用?

apply 可以自己使用,不需要new
在伴生对象里面 定义apply方法

Array(1,2,3,4) new Array[Int]

26.子类继承父类?

scala中没有实现,只有继承extents with

27.类型检查和类型转换?

类型检查:isInstanceof(检查不精确)
精确检查:getClass == classOf
类型转换:asInstanceof

28.scala 的特质?

trait 类似于java interface,接口

29.Nil tail head? list 集合 List(1,2,3,4)

Nil: 表示一个空的集合 ()
tail:表示一个除去第一个元素的集合 (2,3,4)
head:表示集合的第一个元素 1

30.样例类?

样例类Case Class
Case Class一般被翻译成样例类,它是一种特殊的类,能够被优化以用于模式匹配。
当一个类被声名为case class的时候,scala会帮助我们做下面几件事情:

  • 1、构造器中的参数如果不被声明为var的话,它默认的是val类型的,但一般不推荐将构造器中的参数声明为var。
  • 2、自动创建伴生对象,同时在里面给我们实现子apply方法,使我们在使用的时候可以不直接使用new创建对象。
//case class会自动生成apply方法,创建对象时无需用new
// Student是样例
 val p: Person = Student("lisi", 20, "101")
  • 3、伴生对象中同样会帮我们实现unapply方法,从而可以将case class应用于模式匹配。
//match case模式匹配
//Student  Teacher Nobody是样例类
p match {
case Student(name, age, stuNo) => println(s"学生:$name, $age, $stuNo")
case Teacher(name, age, teaNo) => println(s"老师:$name, $age, $teaNo")
case Nobody(name) => println(s"其他人:$name")
    }
  • 4、实现自己的toString、hashCode、copy、equals方法
    除此之此,case class与其它普通的scala类没有区别

31.偏函数 柯里化 闭包 泛型

偏函数: partialFunciton[A,B] A传入的参数类型B传出的参数类型

{
case xxx => xxx
}

柯里化:将原来的两个函数变成一个函数 fun(a,b) => func(a)(b)

闭包:引入函数外部变量

泛型 :一般使用(T)

32.上边界 下边界 视图界定

上边界:传入的参数只能本身或者是子类 <:
上边界:传入的参数只能本身或者是父类 >:
视图界定 : <% 将不是他的子类通过视图界定间接的转换成它的子类

33.隐式转换? 值 参数 方法

Scala的隐式转换,其实最核心的就是定义隐式转换函数,即 implicit conversion function。定义的隐私转换的函数,只要在编写的程序内引入,就会被 Scala自动使用,Scala 会根据隐式转换函数的签名,在程序中使用到隐私转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另一种类型的对象并返回。这就是“隐式转换”。

34.异常

try{
}
catch{
//偏函数
case e:Exception => {}
}
finally{
}

35.协变和逆变

类似于java的向上、向下转型
当s 是A的子类, 那么func(s) 是func(A)的子类。 也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变。 同协变定义,但是是反过来,即当S是A的子类时,func(S)是func(A)的父类。

36.call by name / call by value

call by name: 传递的是函数本身,函数没有进行计算
call by value:传递的是函数的返回值

37.Actor 接收消息的方式?

scala 并发,自带actor。旧版本整合到Akka
接受方法的两种方式:receive
react:性能要比receive高,会复用线程

38.actor 发送消息?

! 发送异步消息 没有返回值
!! 发送异步消息,有返回值 Future
!? 发送同步消息,等待返回值 返回是Any 如果没有返回值,线程处于阻塞状态

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值