java--substring内存溢出问题
发布时间:2020-12-15 05:24:16 所属栏目:Java 来源:网络整理
导读:public class SubStringDemo { //substring() /** * jdk6 当调用 substring() 方法时,创建了一个新的String对象,但是string的value[] 属性域仍然指向堆内存中的原来的那个数组。区别就是 两个对象的 count 和 offset 这两个值不同了 * //JDK6,包级私有构造,
public class SubStringDemo { //substring() /** * jdk6 当调用 substring() 方法时,创建了一个新的String对象,但是string的value[] 属性域仍然指向堆内存中的原来的那个数组。区别就是 两个对象的 count 和 offset 这两个值不同了 * //JDK6,包级私有构造,共享 value数组提升速度 * String(int offset,int count,char value[]) { * this.value = value; * this.offset = offset; * this.count = count; * } * * * public String substring(int beginIndex,int endIndex) { * // ... 检查边界的代码 * // 如果范围和自己一模一样,则返回自身,否则用value字符数组构造一个新的对象 * return ((beginIndex == 0) && (endIndex == count)) ? this : * new String(offset + beginIndex,endIndex - beginIndex,value); * } * 如果有一个"非常"长的字符串,但每次使用substring()时只想要很小的一部分,那么将会引起另一个性能问题: 虽然你只需要很小的一部分,但是持有了整个value[]的引用,从而导致大量内存被占用。 * 要解决这个问题,在JDK6中可以让其指向一个真正的子字符串,示例代码: * // x = x.substring(begin,end) + ""; * //或 x = new String(x.substring(begin,end)) */ /** * jdk8 在堆内存中创建了另一个字符数组 * public String(char value[],int offset,int count) { * // ... * this.value = Arrays.copyOfRange(value,offset,offset+count); //进行数组复制 * } * public String substring(int beginIndex,int endIndex) { * // ... * return ((beginIndex == 0) && (endIndex == value.length)) ? this * : new String(value,beginIndex,subLen); * } */ } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |