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

 更新时间:2026年07月15日 15:16:51   作者:问道于旁  
你是否困惑Java中String的值为何不能修改?其实关键在于final修饰的char数组和引用机制,本文通过实例和源码,生动解释引用、实例对象与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中的saveBatch方法报找不到表的问题

    在用Mybatis plus开发的项目中,用自带的API批量保存的方法saveBatch操作时,发现报没有找到表的错误,本文就来详细的介绍一下解决方法,感兴趣的可以了解一下
    2024-03-03
  • SpringBoot实现动态定时任务的示例代码

    SpringBoot实现动态定时任务的示例代码

    在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,实在不太灵活。现在我们就来实现可以动态修改cron表达式的定时任务,感兴趣的可以了解一下
    2022-10-10
  • Java Spring详解如何配置数据源注解开发以及整合Junit

    Java Spring详解如何配置数据源注解开发以及整合Junit

    Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力,本篇文章带你了解如何配置数据源、注解开发以及整合Junit
    2021-10-10
  • Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】

    Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】

    这篇文章主要介绍了Java二叉搜索树遍历操作,结合实例形式详细分析了Java二叉搜索树前序、中序、后序、层次、广度优先遍历等相关原理与操作技巧,需要的朋友可以参考下
    2020-03-03
  • Java滑动窗口算法题目练习(附详细图文及代码)

    Java滑动窗口算法题目练习(附详细图文及代码)

    在数据处理和算法中,滑动窗口是一种常见的技术,用于解决一些数组或字符串相关的问题,这篇文章主要介绍了Java滑动窗口算法题目练习的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • Java SpringBoot自动装配原理详解及源码注释

    Java SpringBoot自动装配原理详解及源码注释

    SpringBoot的自动装配是拆箱即用的基础,也是微服务化的前提。其实它并不那么神秘,我在这之前已经写过最基本的实现了,大家可以参考这篇文章,来看看它是怎么样实现的,我们透过源代码来把握自动装配的来龙去脉
    2021-10-10
  • Java线程的异常处理机制详情

    Java线程的异常处理机制详情

    这篇文章主要介绍了Java线程的异常处理机制详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 轻松掌握Java工厂模式、抽象工厂模式

    轻松掌握Java工厂模式、抽象工厂模式

    这篇文章主要帮助大家轻松掌握Java工厂模式、抽象工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java虚拟机GC日志分析

    Java虚拟机GC日志分析

    这篇文章主要介绍了Java虚拟机GC日志分析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java和 javaw 及 javaws的区别解析

    java和 javaw 及 javaws的区别解析

    这篇文章主要介绍了java和 javaw 及 javaws的区别解析,本文通过实例给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论