『API探索』之substring()字节字符截取两种方式及内存泄漏问题
substring()或者substr()是大部分主流语言所支持的,同时对字符串的操作是编程中最频繁的操作,当然对截取字符串也是最常用操作之一。所以今天就讨论一下subtring()。
以JAVA举例,在JAVA中我们看看系统提供的substring()有什么问题?
我们首先看看JDK中substring()的源码:
public class MySubString {public static void main(String[] args) {String s = "人在江湖,记录那些有趣的事";System.out.println(subStringByByte(s, 2, 4));System.out.println(subStringByByte(s, 2));}public static String subStringByByte(String s, int begin, int end) {if(null == s || "".equals(s))return null;if (begin < 0 || end > s.getBytes().length || end - begin < 0)return null;byte[] bs = s.getBytes();byte[] new_bs = new byte[end-begin];int index = 0;for(int i = begin; i < end; i++){new_bs[index++] = bs[i];}return new String(new_bs);}public static String subStringByByte(String s, int begin) {return subStringByByte(s, begin, s.getBytes().length);}}- 2楼smszhuang168昨天 15:49
- 能分一下段落看着就更清楚了
- Re: nash_昨天 16:45
- 回复smszhuang168n抱歉,我用手机改下文章后,没想到变成纯文本了
- Re: smszhuang168昨天 08:59
- 回复nash_n嗯,这样看着不错,顶了
- 1楼anhui12345前天 09:53
- 你好!对于本文有一些疑惑:n>>>> 截取字符串的时候并没有重新创造一个String对象n->可是看src里面,明明是new了个string啊: new String(offset + beginIndex, endIndex - beginIndex, value); 没有重新创造的是char[]吧,这样一来,原来的String就没地方引用了啊。不能被释放的是char[]吧,不是旧的String(可能memory上差别并不大)?n盼指导。
- Re: nash_昨天 14:06
- 回复anhui12345n你后面应该说错了,原来的string没有被释放
- Re: nash_昨天 14:41
- 回复anhui12345n你说的对,是创建了新对象,共享了value,感谢您提出错误之处