【Java】String类型为什么不可变

1、什么是不可变对象:
有效final;被private修饰;类不能被继承拓展;类不能对外界提供修改类状态的方法;
2、Java中String类是如何设计成不可变对象的:
首先我们先看如下代码:

public class Demo {
    public static void main(String[] args) {
        String a="小猫";
        System.out.println(a);
        a="小狗";
        System.out.println(a);
    }
}
//此处输出:小猫      小狗

通过上面的代码我们可以看到,a的值的确进行了改变。但是,这里要说明的是,此处的改变,只是一个引用的改变。也就是说,将a的值由“小猫”的引用,转到了“小狗”,而原先的小猫并未改变。如下图:

这里我们来看一下String的源码:

implements java.io.Serializable, Comparable<String>, 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

/** use serialVersionUID from JDK 1.0.2 for interoperability */

由上面的源码可以看到,String有一个private final的值——value ,并且这里并没有提供setvalue的方法。所以,此处很明确的表示出,我们创建的每个String对象均由value保存,也就是说真正改变引用的是value,因为value也是一个数组引用。
3、如何改变String呢?
既然提出了这个问题,那么肯定就是有相应的解决办法的——反射;(此处由于答主还没有学习反射,暂不给出解答,但是,反射是能解决很多违反语言规则的方法)
4、为什么Java中的String要设置成不可变:
首先在Java中String类型的使用十分频繁,需要用到大量的增删改查,每次进行增删改查操作前jvm都要检查这个String对象是否安全,即通过hashcode,当将String设计成不可变对象时候,就有效的保证了每次增删改查的时hashcode的唯一性,也就可以放心的操作。
其次,网络连接地址URL,文件路径path通常情况下都是以String类型保存, 若String是可变的,那么将会引起各种安全隐患。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值