还剩2页未读,继续阅读
文本内容:
Scala常见面试题及答案
1.变长参数跟list作为参数的区别变长参数只能作为最后一个形参,变长参数在调用传参时语义更明确
2.伴生类与伴生对象是什么同一个文件中同名的object和class,可以相互访问彼此的私有变量(但object中若使用private this标注,则伴生类中无法访问)伴生对象中可定义apply方法,目的是通过伴生类的构造函数功能,来实现伴生对象的构造函数功能
3.如何实现单例模式依靠伴生对象,因为对象的创建是单例的
4.trait特质是什么可以被多个类继承
5.A类继承了B类并且继承了C特质、D特质,D特质继承了E类,A在构造时构造器的执行顺序执行B的构造器(执行父类构造器),然后是C的构造器(执行继承特质构造器从左到右),执行E构造器(执行继承特质构造器的父类构造器),执行D构造器,最后是A的构造器
6.偏函数与偏应用函数的区别偏函数时只处理能与至少一个case相匹配情况下的输入偏应用函数是参数不全(调用函数时使用T_)的函数
7.Scala概述Scala是一种多范式语言,它一方面吸收继承了多种语言中的优秀特性,一方面又没有抛弃Java这个强大的平台,它运行在Java虚拟机(Java VirtualMachine)之上,轻松实现和丰富的Java类库互联互通它既支持面向对象的编程方式,又支持函数式编程它写出的程序像动态语言一样简洁,但事实上它确是严格意义上的静态语言,相对于Java而言,Scala的代码更为精简(减低犯错),而且功能更为广泛(Scala其实是Scalable Language的简称,意为可扩展的语言),许多Scala的特性和语法都是针对Java的不足和弱点来设计的
8.scala语言有什么特点?什么是函数式编程?有什么优点?scala语言集成面向对象和函数式编程函数式编程是一种典范,将电脑的运算视作是函数的运算与过程化编程相比,函数式编程里的函数计算可以随时调用
9.scala中的闭包定义你可以在任何作用域内定义函数:包,类甚至是另一个函数或方法在函数体内,可以访问到相应作用域内地任何变量重点函数可以在变量不再处于作用域内时被调用下面就是一个闭包def mulByfactor:Double=x:Double=factor*x〃开始调用val tripe=mulBy3val half=mulBy
0.5printlntripe14+〃〃+half
1410.scala中的柯里化定义柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程新的函数返回一个以原有的第二个参数作为参数的函数,例如〃该函数接受两个参数def mulx:Int,y:Int=x*y〃该函数接受一个参数生成另外一个接受单个参数的函数def niulOneAtTimex:Int=y:Int x*y二〉这样的话,如果需要计算两个数的乘积的话只需要调用mul0neAtTime54这就是函数的柯里化
11.scala中的模式匹配scala的模式匹配包括了一系列的备选项,每个替代项以关键字大小写为单位,每个替代方案包括一个模式或多个表达式,如果匹配将会进行计算,箭头符号=将模式与表达式分离,例如obj match{case1=“one”case2=“two”case3=“three”case=default}
12.case class和class的区别case class:是一个样本类,样本类是一种不可变切可分解类的语法糖,也就是说在构建的时候会自动生成一些语法糖,具有以下几个特点自动添加与类名一致的构造函数也就是半生对象,通过apply方法实现,也就是说在构造对象的时候不需要使用new关键字样本类中的参数默认是val关键字,不可以修改默认实现了toString,equals,hashcode,copy方法样本类可以通过二来比较两个对象,不在构造方法内地二属性不会用在比较上class:class是一个类class在构造对象的时候需要使用new关键字才可以
13.谈谈scala中的隐式转换所谓的隐式转换函数implicit conversionfunction指的事那种以implicit关键字申明的带有单个参数的函数,这样的函数会被自动的应用,将值从一种类型转换为另一种类型比如需要把整数n转换成分数n/1implicit defint2Fractionn:Int=Fractionn,1这样就可以做如下表达式求职val result=3*Fraction4,5此时,隐士转换函数将整数3转换成一个Fraction对象,这个对象接着又被乘以Fraction4,5在scala语言中,隐式转换一般用于类型的隐式调用,亦或者是某个方法内的局部变量,想要让另一个方法进行直接调用,那么需要导入implicit关键字,进行隐式的转换操作,同时,在Spark Sql中,这种隐式转换大量的应用到了我们的DSL风格语法中,并且在Spark
2.0版本以后,DataSet里面如果进行转换RDD或者DF的时候,那么都需要导入必要的隐式转换操作
14.scala中的伴生类和伴生对象是怎么一回事在scala中,单例对象与类同名时:该对象被称为该类的伴生对象,该类被称为该对象的伴生类伴生类和伴生对象要处在同一个源文件中伴生对象和伴生类可以互相访问其私有成员不与伴生类同名的对象称之为孤立对象
15.scala和java的区别变量申明scala只需要申明是val或是var,具体的类型比如String,Int,Double等等,由编译器自行推断java需要在变量前面先注明变量的类型返回值scala申明返回值是在后面,并且不需要retuim语句,非要用,也不是不可以java如果有返回值,需要return语句结束符scala不需要使用分号作为结束符java每个语句结束后需要分号作为结束符循环scala循环语句可以用于守卫java不可以这么写通配符scala_o java:构造器scala构造器名称为this,scala的辅助构造器之前需要有一个主构造器或者其他辅助构造器,并且scala的构造器参数可以直接放在类的后面java构造器名称需要与类名称一样内部类scalascala实例化的内部类是不同的,可以使用类型投影,例如Network#Person表示Network的Person类java内部类从属于外部类接口scalascala中接口称为特质trait,特质中是可以写抽象方法,也可以写具体的方法体以及状态且类是可以实现多个特质的特质中未被实现的方法默认就是抽象的,子类的实现或继承统一使用的事extends关键字,如果需要实现或继承多个使用with关键字特质中可以有构造器特质可以继承普通的类,并且这个类称为所有继承trait的父类javajava中的接口(interface),接口中的方法只能是抽象方法,不可以写具体包含方法体的方法接口中不能有抽象的属性,且属性的修饰符都是public staticfinaE类实现接口需要使用implements关键字,实现多个接口,需要用逗号隔开接口中不可以有构造器接口不可以继承普通的类赋值scalascala中的赋值语句返回结果是unit的不可以串联,例如x=y=l,这样是有问题的,x并没有被赋值为1javax=y=l,这样是没问题的
16.谈谈scala的尾递归正常得递归,每一次递归步骤,需要保存信息到堆栈中去,当递归步骤很多的时候,就会导致内存溢出而尾递归,就是为了解决上述的问题,在尾递归中所有的计算都是在递归之前调用,编译器可以利用这个属性避免堆栈错误,尾递归的调用可以使信息不插入堆栈,从而优化尾递归
17.var,val和def三个关键字之间的区别?•var是变量声明关键字,类似于Java中的变量,变量值可以更改,但是变量类型不能更改•val常量声明关键字•def关键字用于创建方法(注意方法和函数的区别)•还有一个lazy val(惰性val)声明,意思是当需要计算时才使用,避免重复计算。
个人认证
优秀文档
获得点赞 0