java--substring内存溢出问题

本文详细对比了JDK6与JDK8中String类的substring()方法实现方式的不同。在JDK6中,该方法通过共享原始字符串的char数组来提高效率,但在处理长字符串时可能引发内存问题。而在JDK8中,substring()方法通过复制所需部分的char数组,避免了内存泄露的风险。
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);
     *     }
     */
}

转载于:https://www.cnblogs.com/fly-book/p/11332171.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值