Java String 为什么设计成final的

很久以前的面试中就遇到过这个问题:Java String 为什么设计成final的?当时毫无思路,现在倒是有些想法了,记在这里,如有不当之处请斧正。
我想,Java String 设计成final的,就是说不准继承,原因如下:

内存管理

字符串对象在Java内存中是被放到常量池中的,作为常量可以被多个String 对象共同持有,如果改写这一行为,将使这一设计失效,造成混乱。

安全

为什么设计到安全因素,这得从Java Class Loader说起: Java 允许自定义的Loader,一默认的行为是优先从parent class loader查找类,但是也可以修改为优先从自身查找,这样的话就可以用自定义的类来替换标准类,而自定义class loader可能不是被信任的,比如是从网上远程加载的,所以就有安全问题。Java 为了防止这样的问题,规定了核心类库必须从自己的顶层加载器中加载,比如String。那么如果String类可以被继承,就可以从一定程度上绕过这个限制,用自定义的String 子类对象来替代String。

性能

String 是一种不可变对象,如下代码:

String s = "123";
s+="45";

虽然最后s的值是“12345”但s已经不是原来的s了,它指向的对象是生成的新字符串对象。不可变对象可以提高程序性能,因为不会被修改就不需要同步或者锁即可在线程间共享,编程中也不必考虑它被修改的情况,而且可以重复使用节约内存。

发布了20 篇原创文章 · 获赞 9 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/time1812/article/details/79324919