JDK 6中substring(int beginIndex,int endIndex)方法的实现与JDK 7中的实现是不同的。在本文中会去解释这些差异。为简单起见,我们用substring()方法表示此帖中的substring(int beginIndex,int endIndex)方法。

1. substring()有什么作用?

substring(int beginIndex,int endIndex)方法是返回一个以beginIndex开头并以endIndex-1结尾的字符串。

输出:

bc

2.调用substring()时会发生什么?

你可能知道因为x是不可变的,所以当x被赋予x.substring(1,3)的结果时,它就会指向一个新的字符串,如下所示:

然而,这个图表并不是完全正确的。在JDK6和JDK7中,那么当调用substring()时究竟发生了什么不同。

3. JDK 6中的substring()

字符串由后端的char数组支持。在JDK 6中,String类包含3个字段:char value[],int offset,int count。它们分别用于存储实际字符数组、数组的第一个索引、字符串中的字符数。

当调用substring()方法时,它会创建一个新字符串,但该字符串的值仍然指向堆中的同一个数组。两个字符串之间的区别就在于它们的计数和偏移值。

下面的代码经过了简化,只包含了解释这个问题的关键点。

4. JDK 6中由substring()引起的问题

如果你有一个非常长的字符串,但是通过使用substring(),你每次只需要字符串中的很小的一部分。这将导致运行性能出现问题,因为你只需要一小部分,但是你保留了整个字符串。对于JDK 6,解决方案可以用下面的方法,这会使其指向真正的子字符串:

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

5. JDK 7中的substring()

这个问题在JDK 7中得到了改进。在JDK 7中,substring()方法实际是上在堆中创建了一个新数组:

长按订阅更多精彩▼

图解Java的substring()方法底层干了啥?相关推荐

  1. Java中由substring方法引发的内存泄漏

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 在Java中我们无须关心内存的释放,J ...

  2. java string.substring 参数,Java,String类中的subString()方法,stringsubstring

    Java,String类中的subString()方法,stringsubstring public class TestStringSubString { // main函数 public stat ...

  3. 【Java】字符串substring方法在jkd6,7,8中的差异

    1.概述 转载:注意:字符串substring方法在jkd6,7,8中的差异 这篇文章讲的更好:灵魂拷问:Java 的 substring() 是如何工作的? 标题中的substring方法指的是字符 ...

  4. Java String substring()方法示例

    Java String substring() method returns the substring of this string. This method always returns a ne ...

  5. java url substring,Java截取字符串方法subString方法

    String 类的 substring() 方法用于对字符串进行提取,该方法主要有两种重载形式,下面分别介绍. 1. substring(int beginIndex) 形式 此方式用于提取从索引位置 ...

  6. Educoder–Java String类 length()方法与compareTo()方法的使用 - 花名册 substring()方法与indexOf()方法的使用 - 姓名查找编程要求

    文章目录 第1关:length()方法与compareTo()方法的使用 - 花名册 答案 第2关:substring()方法与indexOf()方法的使用 - 姓名查找编程要求 答案 第1关:len ...

  7. java求子串_Java substring()方法:求子字符串(截取字符串)

    String 类中的 substring() 方法实现对字符串从指定的索引位置开始截取,直到此字符串的末尾,并返回一个新的字符串. 语法1 substring(int beginIndex) 参数说明 ...

  8. Java substring() 方法

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

  9. java有substr方法_java substring和substr

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

最新文章

  1. sqlite3 unicode转中文
  2. 微软小动作气炸用户:装Win10系统,现在得被迫注册账号,脱机安装选项被悄悄删除...
  3. Leetcode199二叉树右视图[C++题解]:BFS+层数
  4. apple MacBook air m1是我认为最非常适合学生的笔记本
  5. SpringMVC简单小案例
  6. python type help copyright_python学习 第二天
  7. YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24
  8. Extjs TreeNode的图标元素。 (节点图标, expand的加减号)
  9. GitHub for Windows一般操作
  10. 实验19:Frame-Relay
  11. mysql创建用户删除权限_mysql 用户创建、授权及删除、取消权限操作
  12. 给 Java 说句公道话
  13. 实验一 网络侦查与网络扫描
  14. 一个“蝇量级” C 语言协程库 -- Protothreads
  15. 微信小程序、公众号侵权投诉流程
  16. android 环信集成demo,集成环信即时通讯(导入demo到AndroidStudio)
  17. 弗洛伊德算法(求每一对顶点间的最短路径)
  18. vscode代码格式化时属性不换行
  19. Blender建模笔记 | 大帅老猿threejs特训
  20. 20220407——组合逻辑电路 3-8线译码器

热门文章

  1. matlab图像定位分割,車牌定位matlab程序:通過hsv彩色分割方式定位車牌
  2. 【图论】用一道题从本质上讲清楚Floyd算法
  3. linux多路径策略配置,linux 多路径配置
  4. C - Catch That Cow(BFS)
  5. from name as id为啥报错
  6. 496.下一个更大元素I
  7. typeof,instanceof 和 isProtoTypeof
  8. 完全相同的4个小矩形如图所示放置_3个数学难题——走进传奇数学天才的数字游戏...
  9. 沈志康奖教金 计算机学院,天津大学机械工程学院
  10. 大数据驱动的运营创新和探索