每日三道面试题,通往*的道路2

茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!

愿你在未来的日子,保持热爱,奔赴山海!

每日三道面试题,成就更好自我

欢迎回来,咱们继续昨天的话题吧!昨天讲到了面向对象的特征吧,那接下来我继续提问了!

1. 请问:我们是否可以继承 String类?

不可以,在我们查看String源码的时候,可以发现:String类是被final修饰,是不可以被继承的。

public final class String
    implements java.io.Serializable, Comparable<String>, 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 。

小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!

注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!也可以微信搜索太子爷哪吒公众号进行私聊我,感谢各位大佬!

每日三道面试题,通往*的道路2

上一篇:高效拼接字符串“+”跟StringBuilder.append哪个好?


下一篇:谈谈面试题之String、StringBuffer、StringBuilder的区别及使用场景