java知识点:String类的值不可修改?

核心

首先,需要弄明白的是,这个问题是String类的值,并不是String a,String类型的字符串a的值。
其次,需要弄清楚参数传递概念
	- 值传递和引用传递
	- java只有值传递,

什么是引用?

指向对象的地址

比如有个Person 类 ,创建一个实例对象 Person p = new Person();而p就是引用,而真正的对象是new Person()

什么是实例对象?

也就是值

String类的值什么不能修改?

一般情况下,string的值修改不了。
从源码可知,String类是使用char类型的value数组来存储字符串的,final修饰,所以String类的值(实例对象)不可修改。
源码
在这里插入图片描述

String a = “abc”;改成a = “java”,为什么可以修改?

答:该字符串修改的并非是对象本身,而是将他的另外一个对象引用赋给它,实例对象并没有改变。
可以这么理解:
abc存在常量区,java也存在常量区
a =abc,a指向abc地址
a=java,类似于return的一个操作,更改了a的指向地址到java
上述可用hashcode的值,做辅助推断
在这里插入图片描述

String类的值为什么不能修改_

方法中,为什么str值没有变化?
String类的str,开始指向tarena,到change方法中,指向testok,随后,局部变量生命周期结束,str仍指向原值,原值没有改变,所以值不变
ch字符串,原值发生改变,所以值变了

在这里插入图片描述
在这里插入图片描述

String类型,在底层是怎么创建的?

在这里插入图片描述

反射机制,更改常量池里的值(也就是对象实例)

        String s="0123456789";
        System.out.println("改变前:s=" + s);
        Field f = s.getClass().getDeclaredField("value");
        f.setAccessible(true);
        f.set(s, new char[]{'a', 'b', 'c'});
        System.out.println("改变后:s=" + s);

参考资料

  • String执行源码 http://t.csdn.cn/143Ra
  • 参数传递 http://t.csdn.cn/9iXog
  • http://t.csdn.cn/ZEKjE
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值