注意:字符串substring方法在jkd6,7,8中的差异。

简介: 标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这个方法在jdk6,7是有差异的。substring有什么用?substring返回的是字符串索引位置beginIndex开始,endIndex-1结束的字符串。来看这个例子:


Java核心技术

95 篇文章16 订阅

订阅专栏

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

image.pngJDK6中的部分源码可以说明这个问题。

//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) + ""

DK 7,8

JDK6这种问题在JDK7+中已经改善了,JDK7+中实际是重新创建了一个字符数组,如图。image.pngJDK7中的部分源码,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了吧,其实对于小字符串的这种操作性能也是可以忽略不计的。

相关文章
|
Java 数据库
jdk8环境下,java字符串使用replace()和replaceAll()方法性能对比
jdk8环境下,java字符串使用replace()和replaceAll()方法性能对比
413 0
|
3月前
|
Java
Java系列之:字符串的截取及分割 split() 和 substring()
这篇文章通过示例代码讲解了Java中字符串的截取和分割操作,包括使用`split()`方法根据正则表达式进行字符串分割以及使用`substring()`方法进行字符串截取的不同使用方式及其输出结果。
Java系列之:字符串的截取及分割 split() 和 substring()
|
4月前
|
索引
charAt()方法- 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1,开头的为0, 用来获取单个字符的
charAt()方法- 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1,开头的为0, 用来获取单个字符的
|
4月前
|
机器学习/深度学习 缓存 安全
Python标准库中的`str`类型有一个`translate()`方法,它用于替换字符串中的字符或字符子集。这通常与`str.maketrans()`方法一起使用,后者创建一个映射表,用于定义哪些字符应该被替换。
Python标准库中的`str`类型有一个`translate()`方法,它用于替换字符串中的字符或字符子集。这通常与`str.maketrans()`方法一起使用,后者创建一个映射表,用于定义哪些字符应该被替换。
下列给定程序中函数fun的功能是:统计substr所指的子符串在str所指的字符串中出现的次数。
下列给定程序中函数fun的功能是:统计substr所指的子符串在str所指的字符串中出现的次数。
|
存储 算法 C语言
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
72 0
lodash检查字符串string是否以给定的字符串结尾
lodash检查字符串string是否以给定的字符串结尾
179 0
Zp
截取字符串substring与substr之间的区别
截取字符串substring与substr之间的区别
Zp
177 0
|
JavaScript 前端开发
Javascript 提取指定数目的字符substr()
Javascript 提取指定数目的字符substr()
106 0
Javascript 提取指定数目的字符substr()
|
算法 前端开发
【前端算法】6 和 9 组成的最大数字,replace和indexOf
**给你一个仅由数字 6 和 9 组成的正整数 `num`。** **你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。**
146 0