java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 为什么String类的值不能修改

为什么String类的值不能修改?底层源码解析与常见误区解答

作者:问道于旁

你是否困惑Java中String的值为何不能修改?其实关键在于final修饰的char数组和引用机制,本文通过实例和源码,生动解释引用、实例对象与String不可变性的底层原理,帮你避开常见误区,理解字符串操作的本质

核心

首先,需要弄明白的是,这个问题是String类的值,并不是String a,String类型的字符串a的值。

其次,需要弄清楚参数传递概念

什么是引用?

指向对象的地址

比如有个Person 类 ,创建一个实例对象 Person p = new Person();

而p就是引用,而真正的对象是new Person()

什么是实例对象?

也就是值

String类的值什么不能修改?

一般情况下,string的值修改不了。

从源码可知,String类是使用char类型的value数组来存储字符串的,final修饰,所以String类的值(实例对象)不可修改。

源码:

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

答:该字符串修改的并非是对象本身,而是将他的另外一个对象引用赋给它,实例对象并没有改变。

可以这么理解:

abc存在常量区,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);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文