Java基础系列-substring的原理

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题


代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等


联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

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

202202131606237281.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方法返回的字符串是新建的,而且底层指向的字符数组也是新的。

202202131606244492.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值