val声明变量和var声明变量的不同?
val修饰不可变变量,var修饰可变变量
trait与class的相同点和不同点?
它们的相同点在于都能包含抽象和非抽象成员,且不能直接实例化。
区别在于抽象类的构造方法可传参,而特质的构造方法不能。
一个类实现多个特质后,所涉及的多个构造器的执行顺序是?
所有特质被构造完毕,子类被构造。 构造器的顺序是类的线性化的反向
private修饰的属性的访问权限和protected修饰的属性在访问权限上有相同和不同?
封装性 :private
和 protected
都是封装的一部分,用于限制类成员的访问,以保护类的内部状态和行为。
继承 :如果一个类继承了另一个类,那么继承类可以访问父类的protected
成员,但不能访问private
成员。
不同点
-
访问范围:
private
:被private
修饰的属性或方法只能在定义它们的类内部被访问。它们对子类和其他类都是不可见的。protected
:被protected
修饰的属性或方法可以被定义它们的类、同一个包中的其他类以及子类访问。它们对不同包中的非子类是不可见的。 -
子类访问:
private
:子类不能访问父类的private
成员,即使它们在同一个包中。protected
:子类可以访问父类的protected
成员,无论它们是否在同一个包中。包访问:private
:不允许包访问,即同一个包中的其他类也不能访问。protected
:允许包访问,即同一个包中的其他类可以访问。接口实现:private
:private
成员不能被接口的实现类访问,因为它们对所有外部类都是不可见的。protected
:如果一个类实现了一个接口,那么这个类的protected
成员可以被实现该接口的其他类访问。 -
隐式转换函数的特点是那些?如何让理解隐式转换?
-
自动性 :单向性 安全性 :上下文依赖, 可预测性, 可能导致性能损失, 可能隐藏错误
-
理解隐式转换的关键在于:
-
熟悉语言规则, 注意上下文, 性能考量 代码,可读性, 显式转换, 避免数据丢失, 测试和调试
-
解释一下正则表达式:1[3-8]\\d{9}.r的含义?
-
正则表达式
1[3-8]\d{9}.r
匹配的字符串以数字 "1" 开头,紧接着是一个3到8之间的数字,然后是任意9个数字,最后以字母 "r" 结尾 -
正则表达式中常见的量词及含义?
-
*
(星号):- 表示前面的元素可以出现0次或多次。
-
+
(加号):- 表示前面的元素至少出现1次或多次
-
?
(问号):- 表示前面的元素可以出现0次或1次。
-
{n}
(花括号):- 表示前面的元素恰好出现n次。
-
{n,}
:- 表示前面的元素至少出现n次。
-
{n,m}
:- 表示前面的元素至少出现n次,但不超过m次。
-
*?
、+?
、??
(懒惰量词):- 这些量词与它们对应的贪婪量词相同,但它们是懒惰的,即尽可能少地匹配字符。
-
|
(竖线):- 表示逻辑"或",用于匹配两个或多个选项中的一个。
-
^
(脱字符号):- 表示匹配输入字符串的开始位置。
-
$
(美元符号):-
表示匹配输入字符串的结束位置
-
ListBuffer和List的区别?
-
可变性:
ListBuffer
:是一种可变的集合List
:是一种不可变的集合
-
性能:
ListBuffer
:由于其可变性,ListBuffer
在添加和删除元素时通常比List
更高效,尤其是在集合大小频繁变化的情况下List
:由于其不可变性,List
在遍历和头部操作(如访问第一个元素)时通常更高效。
-
懒加载:
List
:Scala的List
是懒加载的ListBuffer
:ListBuffer
不是懒加载的,它存储的是元素的物理集合。
-
使用场景:
ListBuffer
:当你需要一个可以动态修改的集合,并且关心添加和删除操作的性能时,ListBuffer
是一个好选择。List
:当你需要一个不可变的集合,并且关心遍历和头部操作的性能时,List
是更好的选择。
-
其他操作:
ListBuffer
提供了一些额外的操作,如remove
、insert
等,这些在List
中是不可用的。
-
内存使用:
ListBuffer
可能会使用更多的内存,因为它需要存储额外的信息来支持其可变操作。
-
线程安全:
-
ListBuffer
不是线程安全的,而List
由于其不可变性,天然是线程安全的。 -
如何处理代码中的异常?
-
精确捕获:只捕获你能够处理的异常,而不是所有异常。
-
资源管理 :使用
finally
块或try-with-resources
语句(Java 7+)来确保资源(如文件句柄、数据库连接)被正确关闭。 -
避免空的Catch块:不要仅仅捕获异常而不做任何处理,至少应该记录异常信息。
-
不吞没异常:不要捕获异常后不进行任何处理或不向上抛出。
-
用户友好的消息:向用户提供错误信息时,避免显示技术性或模糊的消息。
-
日志记录:记录异常信息,这对于调试和监控程序运行状态很有帮助。
-
自定义异常:创建自定义异常类,以提供更具体的异常信息。
-
异常链:在自定义异常时,可以通过构造函数传递原始异常,以保留原始异常堆栈信息
-
什么是泛型?在scala中如何使用泛型?
-
泛型用于指定方法或类可以接受任意类型参数,参数在实际使用时才被确定,泛型可以有效 地增强程序的适用性,使用泛型可以 使得类或方法具有更强的通用性。泛型的典型应用场景 是集合及集合中的方法参数,
-
-