简单谈谈Java语言中String类的final作用

什么每个程序员避免不了操作字符串的废话我就不多说了,直接开始正题:Java中String类多处使用final关键字,为什么?

String类的定义如下:

    public final class String implements java.io.Serializable, Comparable, CharSequence {}

    四个地方值得注意:1.final   2.Serializable  3.Comparable  4.CharSequence

         由实现的借口可以看出来,String类似乎和Char有某种关系,没错,代码第一行就是 private final char value[];

    很明显String其实就是(内存中的数据结构)一个char 数组。

 

问题来了。。。。

    是不是感觉有点蹊跷?String类不是不能改变吗【后面讨论为什么不能改变】?那如果底层是char数组,就算是final的,也只能说栈中的引用不可改变,操作value[1] = 200这完全是没有问题的呀。

    写源码的人真的是为你操碎了心,正是怕这样,所以value的权限是final的,并且不能被集成,就怕破坏了这种数据结构和设计。

 

现在讨论一下为什么String s = ”a“;  s+“b“ 不直接改变内存中的数组,而是要直接重起一个堆空间,然后将引用指过去。

    个人认为完全可以不这么设计,假如不这么设计,问题是什么?

        举个栗子:现在有一个数学题 ,int i = 5;  算一下 i+5   那能直接把i的值改成10吗?这从逻辑上来讲,是不符合大部分人逻辑思维的。为了不被更多人骂,就设计成这样了。(个人见解,例子不是很恰当,只是想通俗易懂的讲明白如果不这样设计,副作用在哪里)。

写在最后:String类的final只是方式后人在不了解的情况下,破坏了现有规则。value属性的private final才是实现的根本。

有问题Q792197389

你可能感兴趣的:(java,核心类)