什么每个程序员避免不了操作字符串的废话我就不多说了,直接开始正题:Java中String类多处使用final关键字,为什么?
String类的定义如下:
public final class String implements java.io.Serializable, Comparable<String>, 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才是实现的根本。
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
-
点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
-
关注公众号 『逆行的碎石机』,不定期分享原创知识。
-
同时可以期待后续文章ing🚀