每日三道面试题,通往*的道路2
> 茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!
>
> 愿你在未来的日子,保持热爱,奔赴山海!
# 每日三道面试题,成就更好自我
> 欢迎回来,咱们继续昨天的话题吧!昨天讲到了面向对象的特征吧,那接下来我继续提问了!
## 1. 请问:我们是否可以继承 String类?
不可以,在我们查看String源码的时候,可以发现:String类是被final修饰,是不可以被继承的。
```java
public final class String
implements java.io.Serializable, Comparable, CharSequence {
.....
}
```
而final有什么作用呢?
1. 修饰类时:表示着该类不能被继承。
2. 修饰方法时:表示方法不能被重写。
3. 修饰变量时:表示变量不能被一次赋值,不能再修改了。
所以String被final修饰的好处有:安全,高效。 并且在当只有字符串不可变的时候,我们才能实现字符串常量池,字符串常量池可以为我们缓存字符串,提高程序的运行效率。
> 可以啊,一问多答,秒啊!既然提到了final这个关键字。那么
## 2. 我再问下final、finally、finalize这三者有什么区别吗?
* final:修饰符(关键字)有三种用法:
1. 如果一个类被声明为 final,意味着它不能再派生出新的子类,即不能被继承,因此它和 abstract 是反义词。
2. 将变量声明为 final,可以保证它们在使用中不被改变,被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。
3. 被声明为 final 的方法也同样只能使用,不能在子类中被重写。
* finally: 通常放在try..catch..处理异常中,代表着程序无论正常执行还是发生异常,这里的代码都会执行。 一般是把释放资源的代码放在finally块中。
* finalize: 是Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之 前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的。
> 可以,那再回到String这里,
## 3. 请讲下String和 StringBuilder、StringBuffer之间的区别?
首先String和 StringBuilder、StringBuffer它们都是可以存储和操作字符串的。
* String它是使用final关键字字符数组来保存字符串,所以String对象是不可变的。
* 而StringBuilder和StringBuffer都是继承自AbstractStringBuilder类,这其中也是用字符数组来保 存字符串,但是没有被final修饰,所以是可变的。
* 但是StringBuilder中的方法没有synchronized修饰,所以它的效率会比StringBuffer高。
* 安全方面的话:
- String的对象是不可变的,所以它是线程安全的。
- StringBuffer因为对方法加了同步锁,所以也是线程安全,但是StringBuilder没有加同步锁,所以 线程不安全的。
* 性能方面的话:
- 每次对String类型进行改变的时候,都会生成一个新的String对象, 然后将指针指向新的String的对象。
- StringBuffer和StringBuilder每次修改,会可以对对象本身进行操作修改,而不是生成新的对象并 改成对象引用。
* 使用场景:
* 如果要操作少量的数据用 String 。
* 单线程操作字符串缓冲区下操作大量数据用StringBuilder。
* 多线程操作字符串缓冲区下操作大量数据 用StringBuffer 。
> 小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!
注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!也可以微信搜索太子爷哪吒公众号进行私聊我,感谢各位大佬!
![](https://www.icode9.com/i/ll/?i=img_convert/79f89a7d7541a5f8368bb197c69bca31.png)