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方法时,会在堆中创建一个新的字符数组,也就是说,我们不需要一直维护着原本的字符数组,当截取字符串后,会产生新的字符数组。

posted @ 2020-09-19 15:25  无心大魔王  阅读(241)  评论(0编辑  收藏  举报