JAVA String的不可变设计(结合源码)

1、首先大家可能都知道String是不可变的,那么String为什么不可变呢,我们先看看源码

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
    private int hash; // Default to 0

    private static final long serialVersionUID = -6849794470754667710L;

    private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];

    public String() {
        this.value = "".value;
    }

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
// 省略部分不相关代码

我们可以看到String类是一个final类,意味着他不可以被继承,所以它里面的方法都是不能被重写的。其次它使用字符数组来保存字符串的,这个字符串数组也是final的,意味着他一旦被初始化就不能再被更改
那么我们可能会有疑问,平时我们可以使用

String  a= "123";
a= "456";

这种操作改变String的值啊
其实它最先指向123的时候是java在堆内存中字符串常量池中新建了个字符串常量,然后通过a引用它,我们将a指向456的时候,其实并不是把常量池中的字符串改为456,而是在常量池中新建了个常量,然后让a引用到这个地址
2、为什么String要设计成不可变的
i、提高效率
如果内存池中已经存在一个相同的常量,则不会在新建一个常量,而是直接让该字符串引用已经存在的。
ii、允许String对象缓存HashCode
Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中。
字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存.这也是一种性能优化手段,意味着不必每次都去计算新的哈希码. 在String类的定义中有如下代码:
iii、安全性
String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值