ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java基础系列------String的不可变性、substring方法

2020-09-19 15:33:56  阅读:196  来源: 互联网

标签:字符 java String substring 数组 字符串 可变性


系列开篇

这个系列主要是通过阅读外网上的java基础文章,来达到巩固基础、培养语感和熟悉单词的目的,巩固基础算是优先级最低的一个目的,之所以选择java基础的英文文章就是因为复杂的看不懂呀,只好拿基础的来练练手,希望这个系列完结之后,我至少可以无障碍阅读简单的外网技术文章。


 

这一部分讲到了一点点JVM内存划分的知识,提出了堆的概念。String在java中属于引用数据类型,是存放在堆中的。String声明的变量中存储的是堆中对象的引用。

当调用concat方法对其进行拼接时,实际上并非修改了堆中的字符串对象,而是新建了一个新的字符串对象,并且断开原来的引用,将新对象的引用赋给变量。

最终在总结中也再次提到了,当一个字符串对象创建后,是不可变的,String类的方法宁愿返回一个新的字符串对象也不愿意修改原对象。如果我们想获得一个可变的字符串,我们需要使用StringBufferStringBuilder。

substring方法做了什么?

这个方法将从第一个参数位置的下标开始,一直截取到第二个参数位置的下标-1这段长度的字符串。

在JDK6中,在堆中会有一个字符数组存储着字符串的值,字符串分为三个区域 :char value[], int offset, int count。

他们被用于存储真正的字符串内容,字符串的首位下标和字符串总长度。

当调用substring时,会创建一个新的string,变量的引用会指向新的字符串,但是,新的字符串的char value[]仍旧指向堆中旧的字符数组,这样做会导致性能问题,也就是有的时候,我们只需要长字符串的一部分,但是,依然需要维护着整个字符串在堆中的字符数组。

给出的解决方案是在调用结果后拼接空字符串(意思是强行让原字符数组无法满足需求,而不得不创建新字符数组?)。

在JDK7中这种情况得到了改善,当调用substring方法时,会在堆中创建一个新的字符数组,也就是说,我们不需要一直维护着原本的字符数组,当截取字符串后,会产生新的字符数组。

标签:字符,java,String,substring,数组,字符串,可变性
来源: https://www.cnblogs.com/wxdmw/p/13696386.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有