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

1. substring()做了什么?

substring(int beginIndex, int endIndex)方法返回一个以beginIndex开头,以endIndex-1结尾的String对象。

String x ="abcdef";

x =x.substring(1,3);

System.out.println(x);

输出:

bc

2.当substring()被调用的时候发生了什么?

也许你觉得,因为x是不可变的,当x经过substring(1,3)处理以后,会指向如下一个全新的String对象:

然而,这张图没有正确的表示出堆内存里真正发生了什么。那么当调用substring()方法时,JDK6和JDK7究竟有什么不同呢。

3. JDK 6中的substring()

String是由一个字符数组实现的,在JDK6中,String类由三部分组成:charvalue[], int offset, int count.。他们才是真正用来存储字符的数组,数组的第一个元素用来存储字符的长度。

当调用substring()方法时,会创建一个新的String对象,但是这个String对象的值仍然指向堆内存中相同的数组。真正不同的是它们的计数和偏移量。

下面的代码已经做了简化,只包含解释这一问题的关键部分。

//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.JDK 6中的substring()存在的一个问题

如果有一个非常长的String对象,但是你每次通过substring()只用到其中一小部分。这样就会有一个性能上的问题,对于JDK6来说,使用以下代码可以解决这个问题,这样做会创建一个真正的子字符串对象:

x = x.substring(x, y) + ""

5. JDK 7中的substring()

在JDK7中,substring()方法实际上会在堆内存中创建一个新的数组,这是JDK7中的一项改进。

//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);

}

原文地址:

http://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/

菜鸟译文(三)——JDK6和JDK7中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. JDK6和JDK7中String的substring()方法及其差异

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

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

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

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

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

  6. JS中substring()方法(用于提取字符串中介于两个指定下标之间的字符)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. String中substring方法内存泄漏问题

    众所周知,JDK中以前String类中的substring方法存在内存泄漏问题,之所以说是以前,是因为JDK1.7及以后的版本已经修复了,我看都说JDK1.6的版本也存在这个问题,但是我本机上安装的1 ...

  8. 第三章Struts2 Action中动态方法调用、通配符的使用

    01.Struts 2基本结构 使用Struts2框架实现用登录的功能,使用struts2标签和ognl表达式简化了试图的开发,并且利用struts2提供的特性对输入的数据进行验证,以及访问Servl ...

  9. 菜鸟译文(一)——Java中的继承和组合

    阅读英文的能力对于程序员来说,是很重要的.这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下.水平一般,能力有限,还请各位看官多多指点. 译文: 本文将会举例说明Java中继承和 ...

随机推荐

  1. ubuntu搭建svn服务器(转)

    在阿里云买了个服务器,想上传东西,samba不好用,想起来可以搭个svn用,找到了这篇. 1. 安装SVN apt-get install subversion 2. 建立svn仓库 1). 建立sv ...

  2. 「2014-2-6」TokuMX and MongoDB related materials collection

    简介参考 TokuMX 和 MongoDB 各自的官方站点.       ##  Tokutek 最重要的特点和 marketing word 是所谓 fractal tree indexing te ...

  3. 基于ticket的rw锁

    代码: wiredtiger-2.8.0/src/os_posix/os_mtx_rw.c rw锁结构 struct { uint16_t writers; // Now serving for wr ...

  4. linux tcp协议重传定时器

    RTO:重传超时时间 RTT:往返时间

  5. C#的惰性枚举

    Ruby 2.0有一个新的特性是惰性枚举器,Soi Mort 的博客举了一个例子:可以将下面的代码 File.open(path) {|fp| fp.each_line. \ select {|lin ...

  6. dotnet run是如何启动asp.net core站点的

    在曾经的 asp.net 5 过渡时期,运行 asp.net 5 站点的命令是dnx web:在如今即将到来的 asp.net core 时代,运行 asp.net core 站点的命令是dotnet ...

  7. 初识ASP.NET 5中的Sake与KoreBuild

    从github上签出基于ASP.NET 5的MVC 6的源代码进行编译,发现有2个编译命令: build.cmd是针对Windows的编译命令,build.sh是针对Mac/Linux的编译命令,这本 ...

  8. Mvc4页面缓存设置Cookie导致缓存失效

    [OutputCache(Duration = 60, VaryByParam = "none")]        public ActionResult Index()      ...

  9. MMM互助金融/理财源码

    1.1.1MMM互助金融配比系统源码销售 (3mphp.com/mmm-office.com) 联系QQ: 3375551869,全套源码,包含: 1 源码:安装.开发文档 2 数据库:含演示数据,自 ...

  10. 从配置sublimeClang插件中学到的

    1.不害怕失败的关键在于要事先为失败准备补救措施.2.人们害怕内部结构复杂的东西出错,并以自己缺乏对内部结构的认识为理由而放弃查错.其实某些情况下根本无需对内部结构有多么深入的认识,只需从外部观察就够 ...