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. 手把手教你vue配置请求本地json数据

    本篇文章主要介绍了vue配置请求本地json数据的方法,分享给大家,具体如下:在build文件夹下找到webpack.dev.conf.js文件,在const portfinder = require ...

  2. centos python environment

    3. 在Centos7的docker里装好了httpd,运行报错: $ systemctl start httpd.service Failed to get D-Bus connection: Op ...

  3. MySQL on duplicate key update 批量插入并更新已存在数据

    业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败.因此需要事先判断哪些数据是重复的,哪些是新增的.比较常用的处理方法就是找出已存在的数据,并 ...

  4. js的小练习

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

  5. C#判断点是否在直线上

    判断点在直线上,实际上就是判断点到直线上的垂直距离.点到直线垂直距离为0,则点在线上.当然也可以误差设置误差几个像素. 参考资料并进行修改:http://blog.sina.com.cn/s/blog ...

  6. jQuery改变元素class属性

    //去掉class属性 $(this).parent('li').removeClass("prev_selected"); //去掉同兄弟的class属性. $(this).pa ...

  7. Java 计算两点间的全部路径(一)

    算法要求: 在一个无向连通图中求出两个给定点之间的所有路径: 在所得路径上不能含有环路或重复的点: 算法思想描述: 整理节点间的关系,为每个节点建立一个集合,该集合中保存所有与该节点直接相连的节点(不 ...

  8. 010-监控windows主机

    1)下载windows的zabbix_agent下载地址:https://www.zabbix.com/download 下载客户端并解压到指定目录D:\zabbix,解压后有两个目录:bin和con ...

  9. python算法(一)基本知识&冒泡排序&选择排序&插入排序

    本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...

  10. 深入理解JAVA虚拟机 虚拟机执行子系统

    class类文件的结构 java的class类文件中存在两种结构:无符号数和表.最小的存储单元是8个字节. 无符号数是基本的数据类型,用来描述数字,UTF-8编码的字符串,索引引用. 表示多个无符号数 ...