为什么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);
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
调用Mybatis plus中的saveBatch方法报找不到表的问题
在用Mybatis plus开发的项目中,用自带的API批量保存的方法saveBatch操作时,发现报没有找到表的错误,本文就来详细的介绍一下解决方法,感兴趣的可以了解一下2024-03-03
Java Spring详解如何配置数据源注解开发以及整合Junit
Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力,本篇文章带你了解如何配置数据源、注解开发以及整合Junit2021-10-10
Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】
这篇文章主要介绍了Java二叉搜索树遍历操作,结合实例形式详细分析了Java二叉搜索树前序、中序、后序、层次、广度优先遍历等相关原理与操作技巧,需要的朋友可以参考下2020-03-03


最新评论