String为何是final的

String为何是final的

百度答案

1 主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

2、不允许其他类继承。这个应该不是最终原因,但这里权且也当成是一个原因。

3、 String类中的成员属性也几乎都设计成了private final的,这样String就被设计成一个不变类,这样有助于共享,提高性能。可以将字符串对象保存在字符串常量池中以供与字面值相同字符串对象共 享。如果String对象是可变的,那就不能这样共享,因为一旦对某一个String类型变量引用的对象值改变,将同时改变一起共享字符串对象的其他 String类型变量所引用的对象的值。

4、String被设计为不变类,其中的offset,value[]都被设计成private final的,这样在多线程时,对String对象的访问是可以保证安全的。java程序语言的许多特性依赖于不可变的String对象

我的答案

首先吐槽一下 百度答案都什么乱七八糟的,是个人理解起来都费劲。
1、什么高使用率,什么可能影响性能,所以final???? 这个因为所以这么自然的吗?
2、不允许被继承,这是结论不是原因好伐?
3、这个回答你说的是现象, 成员属性是final的 是讲String怎么实现不可变的,然后马上一个结论一抛,不变类就有助于提高性能??
4、同上。
然后说一下我的猜测:
这个问题要分为两步:
1、为何要设计为final?
String s1 = “abc”, String s2 = “abc”,这样的代码会有很多吧,想象一下,当你的项目运行起来,在heap中存在大量的“abc”对象,是不是很浪费内存,那如何可以解决这个问题,我们将其他字符串变量都指向字符串池的同一个字符串,是不是就解决了。
但是新的问题产生了,如果String 不是final的,是可变的,那是不是会生成巨大的安全问题,我这条线程T1在用着这个"abc"呢,你T2给我变成了“cba”,那是不是就会有问题了。所以String 需要被设计为final 且不可变,来保证其安全性。
2、如何设计成final?
首先 声明String类是Final的,那么就不会存在其他类继承String, 我们想一下String 如果不是final的, 那么我写一个A类继承String, String s1 = new A(“abc”); A类覆盖其方法toUpperCase(),使原字符串变为大写,s1.toUpercase(); 现在s1 输出结果是什么“ABC”,所以如果String可以被继承,那么将是不安全的,因为子类随时可以覆盖你的方法,也就无法实现不可变, 所以首先String类是final的。
然后,类是final就可以了吗?
我们看一下String的源代码头几行,
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. /
private final char value[];
/
* Cache the hash code for the string */
private int hash; // Default to 0
里面有一个final char value[], 我们接着来看以下几行代码,
final char value[] = {‘a’,‘b’,‘c’};
value[1] = ‘d’;
请问现在value是什么?答案是{‘a’,‘d’,‘c’};所以final 只是引用地址不可变,里面的元素还是可以改变的,所以private作用很大,限制其他类对String内部的访问,并且也没有getter setter方法,其他类无法改变String,而String类在设计的时候,所有方法都没有对value进行改变, 所以才使得整个String类是不可变的。
后话:当然通过反射,使得私有方法可使用的这种方式不推荐。
以上就是我对String为何是final的见解了。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值