1、substring()方法做了什么?

substring(beginIndex,endIndex)方法返回一个从beginIndex到endIndex-1的字符串

String x = "abcdef";

x = x.substring(1,3);

System.out.println(x);

输出:"bc"

2、在substring()方法调用的时候都做了什么?

因为字符串 x 是不可变的,当 x 被赋值为x.substring()的时候,x 指向了一个完全新创建的字符串

然而,在jdk源码的底层,在堆内存中,所发生的事情并不是上述那么简单,并且jdk1.6 和 jdk1.7之间存在不同。

3、jdk1.6中的substring()方法

String是由一个char数组来保存的,在jdk1.6中,String类有三个字段:char value[] , int  offset,  int  count

当substring()方法被调用的时候,创建了一个新的字符串,但是新字符串的值,仍然指向对内存中相同的字符串数组

在jdk1.6中哟以下代码:

//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、jdk1.6中的substring()方法可能会引发的问题

如果有一个很长的字符串,并且每次调用substring()方法取得只是很小的一部分字符串

就会出现性能的问题,因为每次取得只是一小部分,如何来解决这个问题?可以调用完substring()方法之后把其变为字符串:

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

5、jdk1.7中的substring()方法

jdk1.7对jdk1.6的做法进行了改进,每次调用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);
}

substring()方法是如何工作的更多相关文章

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

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

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

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

  3. Java substring() 方法

    Java String类 substring() 方法返回字符串的子字符串. 语法 public String substring(int beginIndex) 或 public String su ...

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

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

  5. JavaScript substring() 方法

    定义和用法 substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法 stringObject.substring(start,stop) 参数 描述 start 必需.一个非负 ...

  6. JavaScript之substring()方法讲解

    定义和用法 substring() 方法用于提取字符串中介于两个指定下标之间的字符. 语法 stringObject.substring(start,stop) 参数 描述 start 必需.一个非负 ...

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

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

  8. [译]JDK 6 and JDK 7中的subString()方法

    (说明,该文章翻译自The substring() Method in JDK 6 and JDK 7) 在JDK 6 and JDK 7中的substring(int beginIndex, int ...

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

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

随机推荐

  1. python​日记:优化(SEO)狗学Python的日子(1)

    一名优秀的程序员,在穿越单行道时也会确认双向的来车情况 ——道格拉斯.林德(Doug Linder) 大家可能好奇Python是什么东东,今天是小猿开始学习Python的第一天.周五在公司的时候收到了 ...

  2. 小白学习django第二站-模版配置

    上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...

  3. RabbitMQ入门教程(九):首部交换机Headers

    原文:RabbitMQ入门教程(九):首部交换机Headers 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...

  4. CNN与图像高级应用

    一.图像识别与定位 思路1:视作回归 4个数字,用L2 loss/欧氏距离损失(x,y,w,h)这四个数都是连续值 思路2:借助图像窗口 二.物体识别 0.图像识别与定位: (1)Classifica ...

  5. 吴恩达深度学习:2.16关于python/numpy

  6. MapUtils

    一. package com.wang.utils; import java.util.HashMap; import java.util.Map; import java.util.Set; pub ...

  7. Python3使运行暂停的方法

    在Python3中已经有很大一部分语句与Python2不互通了,运行暂停的方法也有所不同. 1.input(); 这种方法不用包含模块,因此这也是最常用的一种暂停手段. Python2中的raw_in ...

  8. robotframework ride报错 Keyword 'BuiltIn.Log' expected 1 to 5 arguments, got 12.

    错误原因,else和else if使用了小写,必须使用大写才能识别到.

  9. 前端批量迁移NAS存储

    在实际生产中,老的NAS存储无法扩容,需要迁移到新的存储,种种原因只能前端迁移. 系统:Linux 容量:1.5T 为了减少对生产系统的影响. 1.提前将老的存储数据备份到新的存储上: 2.正试割接存 ...

  10. u-boot bl _main分析

    ldr    r0, =(CONFIG_SYS_INIT_SP_ADDR): #define CONFIG_SYS_INIT_SP_ADDR     (CONFIG_SYS_INIT_RAM_ADDR ...