JDK 6和JDK 7中的substring()方法

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结尾的字符串。

String x =“abcdef”;
x = x.substring(1,3);
的System.out.println(X);

输出:

bc

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

你可能知道,因为x是不可变的,所以当x被赋予x.substring(1,3)的结果时,它指向一个新的字符串,如下所示:
1-1.jpeg
但是,这个图并不完全正确。在调用substring()时发生的事情在JDK 6和JDK 7中是不同的。

3.JDK 6中的substring()

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

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

2-1.jpeg

下面的代码是被简化的,只是解释这个问题的关键点。

//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.由JDK 6中的substring()引起的问题

如果你有一个非常长的字符串,但是你每次只需要使用子字符串()的一小部分。这会导致一个性能问题,因为你只需要一小部分,你就保留了全部。对于JDK 6,解决方案使用以下内容,这将使其指向一个真正的子字符串:

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

5.JDK 7中的substring()

这在JDK 7中得到了改进。在JDK 7中,substring()方法实际上是在堆中创建一个新数组。
3-1.jpeg

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

欢迎一起学习探讨:html教程 java基础 css教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值