Java中String类的值为什么创建后不能修改?

 更新时间:2026年07月15日 14:08:36   作者:一只编程的猪猪  
Java中String的值创建后真的不能修改吗?本文深入解析String的不可变性,通过内存变化图和代码示例,带你搞懂字符串常量池、堆栈内存以及==比较的本质,想彻底理解Java String,看这一篇就够了

Java中String类的值在创建后不能修改

在Java中,String类型字符串的值在创建后就不能修改。

这个修改是指String对象本身的内容没有改变,因为事实上String对象内容的改变是通过内存地址的改变来完成的。

String a = "Hello";
String b = "World";
a = a + b;
System.out.println(a);	//Hello World

如上输出结果为“Hello World”,实际内存变化如下图所示。

第二次的a会在方法区的字符串常量池中重新分配一个内存存放“Hello World”,并存放其内存地址,而之前a存放的内存地址中的Hello不会发生任何变化。

对String类进行扩展说明

String类中不同的构造方法在调用时对应在JVM中的操作是不同的。

String a = "Hello";
String b = "Hello";
System.out.println(a == b);	//true

String x = new String("World");
String y = new String("World");
System.out.println(x == y);	//false

如上代码中的两个输出结果是不一样的。第一个输出为“true”,第二个输出为“false”。

这是因为:

  • String a = "Hello";创建对象时,JVM会首先检查方法区中的字符串常量池中是否存在一个内存空间中存放有“Hello”,没有,故在字符串常量池中分配一个内存空间存放“Hello”;
  • String b = "Hello";创建对象时,方法区中的字符串常量池中已经存在一个内存空间中存放有“Hello”,故直接将字符串常量池中"Hello"的地址返回给b,故a == b,所以第一个输出为true。
  • String x = new String("World");创建对象时,首先会在堆中创建一块内存空间,然后将这个内存的地址返回给x(引用,在栈中)。然后因为“World”是字符串常量,JVM首先会去方法区中的字符串常量池中查看是否存在一个内存空间中存放有“World”,没有,故在字符串常量池中分配一个内存空间存放“World”,并将这个内存空间的地址存入刚刚堆中创建出来的内存空间(对象)中。
  • String y = new String("World");创建对象时,首先会在堆中创建一块内存空间,然后将这个内存的地址返回给y(引用,在栈中)。然后因为“World”是字符串常量,方法区中的字符串常量池中查看已经存在一个内存空间中存放有“World”,故直接将字符串常量池中"World"的地址返回给刚刚堆中创建出来的内存空间(对象)中。

以上文字描述可如下图所示

总结

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

相关文章

  • SpringBoot使用Redis Stream实现轻量消息队列的示例代码

    SpringBoot使用Redis Stream实现轻量消息队列的示例代码

    Redis Stream 是 Redis 5.0 引入的一种数据结构,用于处理日志类型的数据,它提供了高效、可靠的方式来处理和存储时间序列数据,如事件、消息等,本文介绍了SpringBoot使用Redis Stream实现轻量消息队列,需要的朋友可以参考下
    2024-08-08
  • java图搜索算法之图的对象化描述示例详解

    java图搜索算法之图的对象化描述示例详解

    这篇文章主要为大家介绍了java图搜索算法之图的对象化描述示例详解,可以带你秒杀所有的图搜索算法,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • 公司一般使用的分布式RPC框架及其原理面试

    公司一般使用的分布式RPC框架及其原理面试

    这篇文章主要为大家介绍了公司一般使用的分布式RPC框架及其原理的面试问题解答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-03-03
  • java之多线程抢火车票的实现示例

    java之多线程抢火车票的实现示例

    生活中有很多多线程的案例,购票就是一个很常见的问题,本文主要介绍了java之多线程抢火车票的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • java异常处理机制示例(java抛出异常、捕获、断言)

    java异常处理机制示例(java抛出异常、捕获、断言)

    这篇文章主要介绍了java异常处理机制示例(java抛出异常、捕获、断言),需要的朋友可以参考下
    2014-05-05
  • springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能

    springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能

    对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题,下面这篇文章主要给大家介绍了关于springboot整合vue2-uploader实现文件分片上传、秒传、断点续传功能的相关资料,需要的朋友可以参考下
    2023-06-06
  • Java substring原理及使用方法实例

    Java substring原理及使用方法实例

    这篇文章主要介绍了Java substring原理及使用方法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • IDEA中maven依赖报红的问题解决办法

    IDEA中maven依赖报红的问题解决办法

    这篇文章主要给大家介绍了关于IDEA中maven依赖报红的问题解决办法,在使用IDEA过程中,经常会出现maven依赖报红的问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • SpringBoot集成Shiro+JWT(Hutool)完整代码示例

    SpringBoot集成Shiro+JWT(Hutool)完整代码示例

    Apache Shiro是一个强大且易用的Java 安全框架,提供了认证、授权、加密和会话管理功能,在现代应用开发中,Shiro 因其简单性和灵活性而被广泛采用,下面通过本文给大家介绍SpringBoot集成Shiro+JWT(Hutool)完整代码示例,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • Java util concurrent及基本线程原理简介

    Java util concurrent及基本线程原理简介

    这篇文章主要介绍了Java util concurrent及基本线程原理简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论