1.什么是scala?
Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
2.总结编程语言? java scala py
c/c++ java Go python c# javascript scala PHP R visualBasic.NET
对比 java scala py
Python
Guido van 1991年将Python带给我们,它后来成为一种非常流行的通用语言,在数据科学界得到了广泛的应用。目前主要版本为3.6和2.7。
优点1. Python是一种非常流行的主流通用编程语言。它有广泛的目标模块和社区支持。许多在线服务提供了一个Python API。
2.Python是一门容易学的语言。低进入门槛使它成为新编程者理想的第一语言。
3.pandas, scikit-learn and Tensorflow的第三包的存在使的Python为先进的机器学习应用提供了很好的应用支持。
缺点1. Python是一种动态类型语言,这意味着类型错误经常是不可预料的。
2.对于特定的统计和数据分析目的,R的大量包使它比Python更具优势。对于通用语言,更快更安全的Python稍有优势。
Python是数据科学的一个很好的选择,而不仅仅是入门级的。大部分的数据科学过程围绕着ETL过程(提取转换加载)。另外Python的通用性非常好,
Java
java是一个非常受欢迎的通用语言,可以在平台之间实现无缝移植。目前由甲骨文公司支持。
优点1. 无处不在。许多现代的系统和应用程序是建立在java后台之上。
2.强类型。java确保类型安全,这对于关键任务的大数据应用程序来说是非常宝贵的。
3.java是一种高性能,通用的语言 。这使得它适合于编写高效的ETL生产代码和计算密集型的机器学习算法。
缺点1. 对于特殊的分析和更专门的统计方案而言,java的冗长使得它不太可能首选。动态类型的脚本语言(如R和Python)可以获得更高的生产率。
2.Java相比于专精于数据领域的语言而言,没有大量的统计方法库。
学习java作为第一选择的数据科学语言。许多公司都会希望=数据科学的生产代码能够直接集成到他们现有的代码库上,另外,你会发现java的性能和类型安全是真正的优势。但是,如果把需求特定于统计和数据科学范围。那么,拥有全面统计和数据科学包的Python和R绝对是不能忽视的选择。
Scala由Martin Odersky在2004发布,是一种能够运行在JVM上的语言。它是一种多范型语言,支持面向对象和函数式编程。
优点
1. 高性能集群计算。对于那些使用高容量数据集的人来说,Scala是一种理想的语言选择。
2.Scala能够编译成java字节码运行在JVM上。这使的Scala成为了一种强大的通用语言,同时也非常适合数据科学。
缺点
1. 如果你刚开始的话,Scala并不是一种可以直接启动和运行的语言。
2.语法和类型系统通常被描述的过为复杂,对于学习Python这样的动态语言的人来说不是一种容易学习的语言。
总结
当使用集群计算来处理大数据时,Scala + Spark是极好的解决方案。应用程序没有那么多的数据需要处理时,如R或Python会是一个更好的选择。
3.jdk 和 sdk 的区别?
SDK是Software Development Kit的缩写,中文意思是“软件开发工具包”。指可以为第三方开发者提供特定的软件包、软件框架、硬件平台、操作系统等创建应用软件开发工具的集合。并且SDK还能简单的为某个程序设计语言提供应用程序接口API的一些文件。
JDK(Java Development Kit,Java开发工具包)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK(Software development kit)。
可以认为jdk只是sdk的一种(子集),
5.scala 的sdk 包含?
1:java的部分类库,2:Scala特有类库 3:对Java类库做了包装
6.Scala语言特点
1.是一门多范式的编程语言,Scala 支持面向对象和函数式编程。
2.Scala 源代码(.scala)会被编译成 Java 字节码(.class),然后运行于 JVM 之上, 并可以调用现有的 Java 类库,实现两种语言的无缝对接。
3.Scala 单作为一门语言来看,非常的简洁高效。
4.将函数式编程语言的特点融合到 JAVA 中,
7.scala 的返回值unit?
相当于java中的void
8.scala 的数据类型?
Byte、Short、Int、Long、Float、Double、Char、Boolean、Unit类型、Null类型、Nothing类型
9.scala 如何实现break和continue功能?
创建对象:val breaks = new breaks
(1)break:breakable放在循环外
(2)continue:breakable放在循环内
10.什么是函数式编程?
解决问题时,将问题分解成一个一个的步骤,将每个步骤进行封装(函数),通过调用这些封装好的步骤,解决问题。
11.函数的语法?
def sum(i:Int,j:Int):Int={方法体}
def函数声明
shm函数名
()形参
Int返回值类型
{}方法体
12.函数和方法的区别?
(1)为完成某一功能的程序指令(语句)的集合,称为函数。
(2)类中的函数称之方法。
(3)Scala语言的语法非常灵活,可以在任何的语法结构中声明任何的语法
(4)函数没有重载和重写的概念;方法可以进行重载和重写
(5)scala中函数可以嵌套定义
13.scala 变量的声明? 区别?
在声明/定义一个变量时,可以使用var或者val来修饰,var修饰的变量可改变,val修饰的变量不可改。
14.函数的参数?
(1)可变参数
(2)如果参数列表中存在多个参数,那么可变参数一般放置在最后
(3)参数默认值
(4)带名参数
15.函数至简原则
(1)return可以省略,Scala会使用函数体的最后一行代码作为返回值
(2)返回值类型如果能够推断出来,那么可以省略
(3)如果函数体只有一行代码,可以省略花括号
(4)如果函数无参,则可以省略小括号。若定义函数时省略小括号,则调用该函数时,也需省略小括号;若定时函数时未省略,则调用时,可省可不省。
(5)如果函数明确声明Unit,那么即使函数体中使用return关键字也不起作用
(6)Scala如果想要自动推断无返回值,可以省略等号
(7)如果不关心名称,只关系逻辑处理,那么函数名(def)可以省略
(8)如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,需要声明返回值类型
16.什么是函数柯里化
函数柯里化:将一个接收多个参数的函数转化成一个接受一个参数的函数过程,可以简单的理解为一种特殊的参数列表声明方式。
17.什么是闭包
闭包:就是一个函数和与其相关的引用环境(变量)组合的一个整体(实体)
18.什么是递归?
一个函数/方法在函数/方法体内又调用了本身,我们称之为递归调用
19.什么是lazy
当函数返回值被声明为lazy时,函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。
20.Scala包的三大作用
(1)区分相同名字的类
(2)当类很多时,可以很好的管理类
(3)控制访问范围
21.scala中的三个默认导入分别是
import java.lang._
import scala._
import scala.Predef._
22.scala 的访问修饰符有哪些?作用域?
(1)scala 中属性和方法的默认访问权限为public,但scala中无public关键字。
(2)private为私有权限,只在类的内部和伴生对象中可用。
(3)protected为受保护权限,Scala中受保护权限比Java中更严格,同类、子类可以访问,同包无法访问。
(4)private[包名]增加包访问权限,包名下的其他类也可以使用
23.Scala类的构造器
Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法
Scala类的构造器包括:主构造器和辅助构造器
(1)辅助构造器,函数的名称this,可以有多个,编译器通过参数的个数来区分。
(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。
24.Scala类的主构造器函数的形参类型
Scala类的主构造器函数的形参包括三种类型:未用任何修饰、var修饰、val修饰
(1)未用任何修饰符修饰,这个参数就是一个局部变量
(2)var修饰参数,作为类的成员属性使用,可以修改
(3)val修饰参数,作为类只读属性使用,不能修改
25.如何调用内部类?
(1)new外部类对象 . 内部类
(2)在外部类中创建方法 返回值为内部类的对象
26.什么是伴生类 伴生对象?
(1)Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,该对象为单例对象。单例对象对应的类称之为伴生类 ,
(2)若单例对象名与类名一致,则称该单例对象这个类的伴生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。
27.object 的特点?
object 里面都是静态,object 修饰的是单例的
28.什么是trait?
Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特征(特征)时,
就可以将这个特质(特征)独立出来,采用关键字trait声明。
Scala中的trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质。
Scala引入trait特征,第一可以替代Java的接口,第二个也是对单继承机制的一种补充。
29.object 的特点?
object 里面都是静态,object 修饰的是单例的
30.scala 的类型检查和类型转换?
(1)obj.isInstanceOf[T]:判断obj是不是T类型。
(2)obj.asInstanceOf[T]:将obj强转成T类型。
(3)classOf获取对象的类名。
31.Scala的集合有三大类
(1)Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。
32.总结scala 集合的特点?
scala几乎所有的集合类,都提供了可变和不可变两个版本,分别位于两个包里
不可变集合:scala.collection.immutable
可变集合: scala.collection.mutable
Scala不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改。
可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。
33.IndexSeq和LinearSeq的区别
(1)IndexSeq是通过索引来查找和定位,因此速度快,比如String就是一个索引集合,通过索引即可定位
(2)LinearSeq是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找
34.map 的取值方式?
根据key方式取值
通过getOrElse函数取值
35.什么是元组?
元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组
元组中最大只能有22个元素
36.什么是模式匹配?
模式匹配类似于Java中的switch语法,但是更加强大。对变量进行判断,针对不同的条件进行不同处理
模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。如果所有case都不匹配,那么会执行case _分支,类似于Java中default语句
37.什么是样例类?
1:样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类
2:类似于javaBean 自动封装了get set ,重写了 toString hashcode equals
3:自动生成 伴生对象,生成了apply方法,样例类可以直接使用模式匹配
样例类仍然是类,和普通类相比,只是其自动生成了伴生对象,并且伴生对象中自动提供了一些常用的方法
样例类是为模式匹配而优化的类,因为其默认提供了unapply方法,因此,样例类可以直接使用模式匹配,而无需自己实现unapply方法
构造器中的每一个参数都成为val,除非它被显式地声明为var(不建议这样做)
38.什么是偏函数?
偏函数也是函数的一种,被包在花括号内没有match的一组case语句?,返回值类型是PartialFunction[A,B]A表示传入参数类型,B表示返回值类型,多用于模式匹配
通过偏函数我们可以方便的对输入参数做更精确的检查,偏函数的输入类型为List[Int]
39.什么是隐式转换? 包含哪些?
Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它可以允许你手动指定,将某种类型的对象转换成其他类型的对象 ,通过这些功能,可以实现非常强大,而且特殊的功能。
隐式转换可以再不需改任何代码的情况下,扩展某个类的功能。
包括:隐式函数、隐式参数、隐式类
40.什么是协变和逆变?
协变 : 对于 B 是 A 的子类 ,有 MyClass[B] 也是 MyClass[A] 的子类
逆变 : 对于 B 是 A 的子类 ,有 MyClass[A] 也是 MyClass[B] 的子类
41.什么是上边界 下边界?
上边界: 传入的类型只能是 本类或者子类
下边界: 传入的类型只能是 本类或者父类