(说明,该文章翻译自The substring() Method in JDK 6 and JDK 7

在JDK 6 and JDK 7中的substring(int beginIndex, int endIndex) 方法是不同的。了解这个不同能够帮助你更好的使用它们。为了简单起见,我将使用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被分配调用结果x.substring(1,3),它会执行一个全新的数组就像下面所示一样:



但是这个图片并不是完全准确的表示出实际在堆中发生的事情。当这个方法被调用的时候在JDK6和JDK7中是不一样的。

3.在JDK6中的substring()

String底层是有一个char类型的数组来实现的。在JDK6中,String类含有3个属性: char value[], int offset, int count。他们用来存储真的字符数组,数组的第一个索引值,字符串中字符的数量。

当一个substring()方法被调用的时候,它创建了一个字符串,但是在堆内存中这个字符串的值仍然执行相同的数组。这两个字符串之间的区别就是他们的count和offset。

下面的简单代码表示了这个关键的不同之处


//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()方法引起的问题

如果你使用一个非常长的字符串,但是你在每次使用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);
}

[译]JDK 6 and JDK 7中的subString()方法的更多相关文章

  1. [转]JDK6和JDK7中的substring()方法

    substring(int beginIndex, int endIndex)在JDK6与JDK7中的实现方式不一样,理解他们的差异有助于更好的使用它们.为了简单起见,下面所说的substring() ...

  2. JDK6和JDK7中的substring()方法

    substring(int beginIndex, int endIndex)在JDK6与JDK7中的实现方式不一样,理解他们的差异有助于更好的使用它们.为了简单起见,下面所说的substring() ...

  3. Java的String中的subString()方法

    方法如下: public String substring(int beginIndex, int endIndex) 第一个int为开始的索引,对应String数字中的开始位置, 第二个是截止的索引 ...

  4. 了解JDK 6和JDK 7中substring的原理及区别

    substring(int beginIndex, int endIndex)方法在jdk 6和jdk 7中的实现是不同的.了解他们的区别可以帮助你更好的使用他.为简单起见,后文中用substring ...

  5. substring()方法到底做了什么?不同版本的JDK中是否有区别?为什么?

      该文章是图说Java系列文章中的一篇 substring(int beginIndex, int endIndex)方法在jdk 6和jdk 7中的实现是不同的.了解他们的区别可以帮助你更好的使用 ...

  6. 二 、在 JDK 6 and JDK 7中 substring() 方法

    在JDK6 和JDK 7 里面substring(int beginIndex, int endIndex)的方法是不同的.知道这种区别会帮助你更好用它们.为了简单期间,下面用substring() ...

  7. 菜鸟译文(三)——JDK6和JDK7中substring()方法的对比

    substring(int beginIndex, int endIndex)方法在JDK6和JDK7中是不同的.了解他们的区别可以让我们更好的使用这个方法.方便起见,以下用substring() 代 ...

  8. JDK6与JDK7中String类subString()方法的区别

    1.subString()方法的作用 subString(int beginIndex, int endIndex)方法的返回的是以beginIndex开始到 endIndex-1结束的某个调用字符串 ...

  9. JDK6和JDK7中String的substring()方法及其差异

    翻译人员: 铁锚 翻译日期: 2013年11月2日 原文链接: The substring() Method in JDK 6 and JDK 7   在JDK6与JDK7这两个版本中,substri ...

随机推荐

  1. Oracle数据表被drop后的恢复

    对于被drop的表和索引,都会存放在回收站中(所以对于生产的数据库必须设置好回收站功能) 由于本次生成环境在drop掉已有的表后,又一次创建了很多的表,全部直接还原的话会提示原有对象存在,表名反复.当 ...

  2. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  3. Bootstrap(2)整体架构

    Bootstrap(2)整体架构 大多数Bootstrap的使用者都认为Bootstrap只提供了CSS组件 和JavaScript插件,其实CSS组件和JavaScript插件只是Bootstrap ...

  4. Power Strings (poj 2406 KMP)

    Language: Default Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33205   ...

  5. 利用System.Net.Mail 的SmtpClient发送邮件

    原文:利用System.Net.Mail 的SmtpClient发送邮件 几个月前总结过关于Jmail发送邮件,当时用Jmail发送邮件发送速度有点慢(可能对Jmail了解不是很多).现在改为用微软提 ...

  6. ABP应用层——参数有效性验证

    ABP应用层——参数有效性验证 基于DDD的现代ASP.NET开发框架--ABP系列之17.ABP应用层——参数有效性验证 ABP是“ASP.NET Boilerplate Project (ASP. ...

  7. springMVC3得知(五岁以下儿童)--MultiActionController

    Spring为了提供一个多动作控制器,您可以使用它的几个行动统一到一个控制器,这可以放在一起功能. 多动作控制器存在在一个单独的包中--org.springframework.web.mvc.mult ...

  8. sharepoint 2013 配件控制FileUpload如何检查是否图像的方法

    它记录的附件控制FileUpload如何检查是否图像的方法: function checkImg() { var fileObj =document.getElementById('<%=Fil ...

  9. 更新内置flash方法[转]

    原文地址:http://bbs.theworld.cn/thread-223573-1-1.html 由于目前flash插件版本较旧,而旧版flash可能会导致崩溃,其实更新方法很简单,请看如下教程. ...

  10. Spark操作hbase

    于Spark它是一个计算框架,于Spark环境,不仅支持单个文件操作,HDFS档,同时也可以使用Spark对Hbase操作. 从企业的数据源HBase取出.这涉及阅读hbase数据,在本文中尽快为了尽 ...