String类为什么是不可改变的?

String类为什么不可以改变内容?
String类其实是对字符数组进行了封装操作,用户真正操作的其实字符数组,既然是数组,我们知道传统的数组有一个天生的缺点:长度不可改变。我们在讲解继承的时候,我们是不是自己实现了一个Array类的操作啊,在这个类道中我们是不是定义了一个addLen()的方法,这个方法主要是为了动态扩展数组长度而定义的,但是我们发现这个方法中改变的专其实并不是数组长度,而是数组的引用地址。也就是说,我们改变的不是字符串的内容,属而是字符串的引用地址。那原来的堆内存是不是就会成为垃圾啊?等待JVM回收。简单的说就是:字符串内部其实就是一个使用final关键字定义的char[]数组,数组长度一旦声明则不可改变,字符串一旦声明则不可改变,改变的引用内存指向。

假设String s=new String (“wo”);String s1=new String(“de”); s=s+s1; System.out.println(s);结果为wode?

首先在栈中有个"s"变量指向堆中的"wo"对象… 栈中"s1"变量指向堆中的"de"对象 当执行到百s = s + s1;
系统重新在堆中new一个更大的数组出来,然后将"wo"和"de"都复制进去,然后栈中的"s"指向这个新new出来的数组…
所谓的不可变是指:它没有在原数组“wo”上进行度修改,而是新建了个更大数组进行扩版展,也就是说,这时候堆里还是有“wo”这个对象数组存在的,只不过这个时候"s"变量不在指向"wo"这个数组了,而是指向了新new出来的数组,这就是和StringBuffered的区别,后者是在权原数组上进行修改,改变了原数组的值,StringBuffered不是通过新new一个数组去复制,而是在原数组基础上进行扩展…再让变量指向原数组…

自己理解:String类改变的只是引用变量所指的对象,即在堆中创建的新对象。原String长度和内容并未发生改变。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值