对java字符串是不可变的特性深度理解_java字符串不可变的理解_Rainly1的博客-程序员秘密

技术标签: java基础  

我们都知道java中有堆、栈、方法区等
而字符串存储在堆内存得常量池中(最新版java中)

例如:String a = “ssss”;
a就在栈内存 叫做引用
ssss则存在堆内存的常量池中
而这个=号则代表地址的指向
附上一张图:

在这里插入图片描述

为什么不可变呢? 因为字符串使用的是数组数据结构而数组大家都知道数组的地址是需要连续的 然而字符串没有固定的存储长度所以必须一开始指定假设

ssss占用了四个内存在这里插入图片描述
如果它是可变的那么我想多一个内存直接在后面加不就得了问题的关键是在内存中不只有一个线程在运行

在这里插入图片描述
比如黑色的地方很可能就会被其他线程的程序占用内存就导致无法添加删除一块对于计算机而言判断地址之类的也是开销所以字符串不是可变的

看个例子:

String a = "111";
a = a.substring(0,2);

内存是什么样子的呢

在这里插入图片描述一开始是实线指向之后是虚线指向,”111“这一块地址是不会改变的如果重新给a换值,那么他将申请一个新的内存并将a中的地址的值换成“11”但是原来“111”本身的地址是不会发生改变。
这就涉及到了java的一个特性在java中都是值传递

如果有一个String b = “111”;
那么是不是也要申请一个内存呢其实是不用的,这也是不可变字符串的一个优点编译器可以让字符串共享 也就是说b指向a指向的那个位置

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rainly1/article/details/96290037

智能推荐

Javascript falsy truthy false true 之间的关系_不头秃的码农的博客-程序员秘密

1.什么是 falsy ?MDN上这样说:Afalsy(sometimes writtenfalsey) value is a value that is considered false when encountered in aBooleancontext.—— falsy(虚值) 是在 Boolean上下文中认定为false 的值。JavaScript在需要用到布尔类型值的上下文中使用强制类型转换将值转换为布尔值,例如条件语句和循环语句。在 JavaScr...

Throw、Throws、Try 和-Catch区别_throw throws try_严文文-Chris的博客-程序员秘密

Throw、Throws、Try和-Catch区别最近碰到异常处理,在这里好好总结一下:1、Throw就是抛出一个一场,并获取这个异常的引用,这个一场会被抛到外部的环境,由外部环境进行处理public void func() throws Exception() { throw new Exception ();

Ubuntu系统搭建以太坊私有链_Hannnnn Qian的博客-程序员秘密

以太坊环境搭建 安装go环境Geth安装$ sudo apt-get install software-properties-common $ sudo add-apt-repository -y ppa:ethereum/ethereum $ sudo apt-get update $ sudo apt-get install ethereumgeth --help:...

在windows下用XShell 连接虚拟机linux Ubuntu14,以及静态ip,DNS设置_litterbear的博客-程序员秘密

在windows下用XShell 连接虚拟机linux Ubuntu14,以及静态ip,DNS设置## linux静态ip设置 ##配置window上的网络: 如果为nat则配置VMnet8 如果为桥接则配置VMnet1 vim /etc/network interfaces 配置如下:1 auto eth0 2 iface eth0 inet static 3 address 192.

金额大写转换_currtobignum()_yuwentaro的博客-程序员秘密

金额大写转换老大,你的金额大写转换是有问题的。16,409.02。通过你的函数[CurrToBigNum(.01)]转换过来就是“壹万陆仟肆佰零玖元零角贰分”,正确的写法应该是“壹万陆仟肆佰零玖元零贰分”。多了个"零角" 其他的我没有细测。以下是转换标准正确填写票据和结算凭证的基本规定    银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、

关于蚊香数组的实现_c语言蚊香数组_yanghao58686763的博客-程序员秘密

123 894 765 1  2  3  4  5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 这样的数组称蚊香数组 给定参数N 求data[N][N]蚊香数组的实现 /**//*解这类题,主要就是要注意方向和步长控制       以你这道题为例谈谈做法    1     2     3     4     5    16

随便推点

quote用法_quote命令_会编程的漂亮小姐姐的博客-程序员秘密

from urllib.request import quotea=‘测试’url = quote(a, encoding=“utf-8”)print(url)

Android imageView ScaleType.FIT_CENTER ScaleType.FIT_XY _心扑通扑通跳的博客-程序员秘密

Android的imageView ScaleType.FIT_CENTER ScaleType.FIT_XY 如题,如果直接设置ScaleType.FIT_CENTER有可能在图片比较大的时候,会出现上下或者左右出现空白的情况android:adjustViewBounds="true" 即适应View的边缘一般用法android:scaleType="fitC...

Java Web黑马程序员 听课笔记_金戈大王的博客-程序员秘密

一、Web后台架构二、HTTP请求请求头Accept: 客户机支持的数据类型Accept-Charset: 客户机采用的编码Accept-Encoding: 客户机支持的数据压缩格式Accept-Language: 客户机的语言环境Host: 想访问的主机名If-Modified-Since: 告诉服务器资源的缓存时间Referer: 告诉服务器,我是从哪个

推荐文章

热门文章

相关标签