记一道面试题
Posted zcydd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一道面试题相关的知识,希望对你有一定的参考价值。
在最近的面试中遇到一道基础的题目但是研究后发现大有文章,于是记下
题目是 : 为什么String 会被设计成final类
由于String是被final修饰,所以经常会被拿出来当做面试java基础的一个知识点。
我知道由于被final修饰,String是不可被修改的,每次操作都是等于在创建一个新的字符串,但是我并没有去深想为什么会被这样设计。
接下来看为什么会被这么设计:
(以下是个人理解,如有错误,不当之处,欢迎指正)
首先先复习一下final修饰符:
1:被修饰的类不可被继承;
2:被修饰的方法不可以被重写;
3:被修饰的变量不可以被多次赋值;
final修饰符从上面的说明可以看到,是为了保证被修饰的类/方法/变量不会被人修改。
那么为什么String类不可以让人修改继承呢?
我从String代码中找到了线索:
Strings are constant; their values cannot be changed after they
are created. String buffers support mutable strings.
Because String objects are immutable they can be shared.
这是String类的注解说明,从上文可以得知,String一旦被创建就不可被改变,因为String对象是被设计成可以被共享的常量。
然后再查找基本类型对应的封装类,也全部都是被final修饰,那么现在明白一点,这些可以被共享的常量类都是不允许被修改的。
我知道常量的储存位置是在jvm的常量池中,对于多个相同值的常量对象可以共用一个常量池中的值,这样可以大大的节省了存储空间,可以让程序创造出更多的常量对象。
为什么常量池会有这样的效果?
首先说明常量池的来源:在Java程序中,有很多的东西是永恒的,不会在运行过程中变化。比如一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型,一个常量,还有在程序中出现的大量的字面值。
由于这些永恒对象,所以需要一个专门的存储空间去存储,于是有了常量池。这些永恒对象(常量项)在常量池中以表的形式存储。
因为这些对象是以表的形式存储,那么就可以去用来查询,所以有了常量池技术,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个)。
这样就实现了上面所说的多个相同对象共用同一个值的效果,这种共有一个值的对象被称为拘留对象,比如拘留字符对象。
如果允许让常量在自身上进行修改,那么上面的效果将很难达到,因为如果有一个常量修改了自身的值,那么原先其他与这个常量共用一个值的常量对象都会被修改值。
所以从安全和效率上考虑,常量对象必须是不可被修改的,常量类一定会被final修饰。
以上是关于记一道面试题的主要内容,如果未能解决你的问题,请参考以下文章