Simple Java—Strings and Arrays(二)substring()在jdk6和jdk7中的不同
2016-01-24 22:37
489 查看
Translate from Simple java
substring(int beginIndex,int endIndex)方法在jdk6和jdk7中是不同的。知道这个不同可以帮助我们更好的http://www.programcreek.com/simple-java/使用这个方法。出于简单的目的,下文中的substring()代表substring(int beginIndex,int endIndex)这个方法
输出:bc
然而,上图其实并没有很准确的描述出真正在堆内存中发生的事情。在jdk6和jdk7中,substring()被调用时内存里的改变是不同的
当substring()方法被调用时,它创造了一个新的string字符串,但是这个string字符串的value数组仍然指向内存中原来的数组。不同的是这两个字符串的offset和count不同
接下来的代码简单的解释了这个问题
substring(int beginIndex,int endIndex)方法在jdk6和jdk7中是不同的。知道这个不同可以帮助我们更好的http://www.programcreek.com/simple-java/使用这个方法。出于简单的目的,下文中的substring()代表substring(int beginIndex,int endIndex)这个方法
1. substring()做了什么?
substring(int beginIndex,int endIndex)方法返回了一段从beginIndex到endIndex-1之间的子串String x = "abcdef"; x = x.substring(1,3); System.out.println(x);
输出:bc
2. 当substring()被调用时发生了什么?
你可能知道,因为字符串的不可变性,当字符串x赋值为x.substring(1,3)时,它会创造一个新的字符串如下:然而,上图其实并没有很准确的描述出真正在堆内存中发生的事情。在jdk6和jdk7中,substring()被调用时内存里的改变是不同的
3.jdk6中的substring()
String是用char数组存储的。在jdk6里,String 的类有三个域:char value[],int offset,int count。它们分别用来表示存储真正字符的数组,字符串的头字符在value数组里的位置,字符串的字符长度。当substring()方法被调用时,它创造了一个新的string字符串,但是这个string字符串的value数组仍然指向内存中原来的数组。不同的是这两个字符串的offset和count不同
接下来的代码简单的解释了这个问题
//JDK 6 String(int offset, int count, char value[]) { this.value = value; this.offset = offset; this.count = count; } public String substring(int beginIndex, int endIndex) { //check boundary return new String(offset + beginIndex, endIndex - beginIndex, value); }
4.jdk6中substring()引起的问题
如果你有一个非常长的string字符串,但是你用substring()方法截取了很小的一段子串,这个会导致性能问题。因为你仅仅需要一小部分,但是你存储了整个字符串。对于jdk6,解决的办法如下,这个方法会让你的字符串变成真正的子串x = x.substring(x, y) + ""
5.jdk7中的substring()
这个问题在jdk7中得到了改进。在jdk7中,substring()方法在堆内存中创建了一个新的数组//JDK 7 public String(char value[], int offset, int count) { //check boundary this.value = Arrays.copyOfRange(value, offset, offset + count); } public String substring(int beginIndex, int endIndex) { //check boundary int subLen = endIndex - beginIndex; return new String(value, beginIndex, subLen); }
译者补充
从jdk7开始,string类去除了offset,count两个域。也就是现在的字符串的value数组存储的就是字符串的全部内容。相关文章推荐
- java 静态Static的理解
- Java final修饰词
- 基于JAVA的Promise模式实现
- java final
- Javaoo入门前总结
- 命题逻辑证明机JAVA实现方案
- 自己动手实现Spring IoC框架
- 自己动手实现Spring IoC框架
- 自己动手实现Spring IoC框架
- Eclipse使用Fresco
- 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray
- Java Swing界面编程(22)---事件处理:动作事件及监听处理
- Java 中的 static 静态方法
- java(十八)抽象类和抽象方法
- Java的登记式单例代码
- 跟我学SpringMVC目录汇总贴、PDF下载、源码下载
- Java [Leetcode 172]Factorial Trailing Zeroes
- 图片教程:写好的Java Web项目部署到阿里云服务器
- (转)Java静态变量,静态类,静态方法
- 【转】Spring的WebServiceTemplate访问WebService的方法及其本质原理