小伙伴们注意了!
小编在这里给大家送上关注福利:
转发本文,关注+私信小编“资料”即可领取小编精心准备的资料一份!
JDK 6中子字符串(int beginIndex, int endIndex)方法的实现与JDK 7不同。
这篇文章解释了其中的差异。
为了简单起见,substring()方法表示本文中的substring(int beginIndex, int endIndex)方法。
1. substring()是什么?
substring(int beginIndex, int endIndex)方法返回一个以beginIndex开头,以endIndex-1结尾的字符串。
输出:
2. 调用substring()时会发生什么?
你可能知道,由于x是不可变的,当x被赋值为x.substring(1,3)的结果时,它指向一个新的字符串,如下所示:
然而,这个图表并不完全正确。
在JDK 6和JDK 7之间,调用substring()时实际发生的情况是不同的。
3.JDK 6中的substring()
字符串由后端中的char数组支持。
在JDK 6中,String类包含3个字段:char value[]、int offset、int count。
它们用于存储实际字符数组、数组的第一个索引、字符串中的字符数。
当调用substring()方法时,它会创建一个新的字符串,但是字符串的值仍然指向堆中的相同数组。
这两个字符串之间的区别是它们的count和offset值。
下面的代码经过了简化,只包含解释这个问题的关键点。
4. JDK 6中的子字符串()引起的问题
如果你有一个非常长的字符串,但是每次使用substring()只需要一小部分。这将导致性能问题,因为只需要一小部分,就可以保留整个组件。对于JDK 6,解决方案是使用以下代码,这将使它指向一个真正的子字符串:
5. JDK 7中的substring()
这在JDK 7中得到了改进。
在JDK 7中,substring()方法实际上在堆中创建一个新数组。