2021-05-05 15:45  阅读(3118)
文章分类:Java 基础系列 文章标签:JavaJava 基础
©  原文作者:唯一浩哥 原文地址:https://www.jianshu.com/u/c52a29db48b6

JDK 6和JDK 7中substring的原理及区别

substring(int beginIndex, int endIndex)方法用于截取字符串,返回截取的新字符串。新字符串由当前字符串的第beginIndex到endIndex的字符组成,长度无endIndex-beginIndex。

JDK 6中的实现原理

        public final class String
            implements java.io.Serializable, Comparable<String>, CharSequence {
            //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);// 关键就在这里传的value,这个value就是字符数组,新的字符串延用value,只是修改了属性值
            }
        }
    

substring方法返回的字符串对象时新创建的,但是底层指向的字符数组并未改变,还指向原字符串对象指向的字符数组,仅仅是使用对象中的三个属性来限制字符数组的开始位置与长度,展现给我们的就是截取完的新字符串。

202105051545484221.png

图片来自网络

JDK 7中的实现原理

        public final class String
            implements java.io.Serializable, Comparable<String>, CharSequence {
            //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);
            }
        }
    

substring方法返回的字符串是新建的,而且底层指向的字符数组也是新的。

202105051545494502.png

图片来自网络


来源:https://www.jianshu.com/u/c52a29db48b6

点赞(3)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> Java基础系列-substring的原理
上一篇
Java基础系列-Enum深入解析
下一篇
Java基础系列-时间日期API