标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这个方法在jdk6,7是有差异的。

substring有什么用?

substring返回的是字符串索引位置beginIndex开始,endIndex-1结束的字符串。

来看这个例子:

String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);

输出:

bc

下面看看在JDK之间,它们的实现原理有什么不一样,及值得注意的地方。

JDK 6

String背后是由char数组构成的,在JDK6中,String包含三个字段:char value[], int offset, int count,意思很简单。

substring被调用时,它会创建一个新的字符串,但字符串的值还指向堆中同样的字符数组。它们的区别只是数量和下标引用不一样,如图所示。

JDK6中的部分源码可以说明这个问题。

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

会有什么问题?

如果一个很长的字符串,但是每次使用substring(),你只需要很小的一部分。这将会导致性能问题,因为只需要一小部分,却引用了整个字符数组内容。对于JDK 6,解决方案是使用以下内容:

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

JDK 7,8

JDK6这种问题在JDK7+中已经改善了,JDK7+中实际是重新创建了一个字符数组,如图。

JDK7中的部分源码,JDK8类似。

//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的这种差异,我们知道就好,现在应该都是JDK7及8了吧,其实对于小字符串的这种操作性能也是可以忽略不计的。

推荐阅读

干货:2TB架构师四阶段视频教程

面经:史上最全Java多线程面试题及答案

面经:史上最全阿里高级Java面试题

面经:史上最全Spring面试题

教程:最全Spring Boot全套视频教程

书籍:进阶Java架构师必看的15本书

工具:推荐一款在线创作流程图、思维导图软件

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

最新文章

  1. 新建STM32工程
  2. Scrum不是万能药,要在时机成熟时推行
  3. ThinkPHP的cookide保存二维数组的方法
  4. ACM KMP 格式输入导致TLE
  5. VueJs(5)---V-bind指令
  6. High Availability手册(3): 配置
  7. 翻译:SockJS-node文档(一)
  8. ASP.NET MVC 扩展方法
  9. Redis中单机数据库的实现
  10. linux操作命令 开发人员需要掌握的一些命令
  11. 详解Docker的网络模式
  12. poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈
  13. luogu P2516 [HAOI2010]最长公共子序列
  14. [POI2011]Inspekcja
  15. python 爬虫数据准换时间格式
  16. Apache URL重写的配置 及其 apache500错误
  17. 对ubuntu初学感想
  18. MySQL数据库启停
  19. 第五章 类加载器ClassLoader源码解析
  20. [sz,rz]使用sz/rz在两台Linux设备之间传输数据

热门文章

  1. SQL语句常用优化技巧
  2. php开发面试题---创建型设计模式1(创建型设计模式有哪几种)
  3. 4种xml解析器区别
  4. Codeforces 1189C Candies!
  5. 剑指offer——72圆圈中最后剩下的数字
  6. c#获取图片的高和宽
  7. 高并发下的缓存架构设计演进及redis常见的缓存应用异象解决方案
  8. git branch 分支和分支合并
  9. UncategorizedSQLException异常处理办法
  10. javascript基础入门之js中的结构分支与循环语句