惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
小众软件
小众软件
GbyAI
GbyAI
B
Blog RSS Feed
月光博客
月光博客
A
About on SuperTechFans
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
博客园_首页
G
Google Developers Blog

博客园 - 唯一浩哥

2026 年,macbook air 2015 升级硬盘注意事项 Java集合系列-HashSet Java基础系列-单例的7种写法 Java基础系列-Lambda Java基础系列-SPI你认识吗 Java基础系列-时间日期API Java基础系列-RandomAccess Java基础系列-Optional 那些字段适不适合建索引? Mysql笔记 Spring知识点 Java基础系列-浅拷贝和深拷贝 前端-javascript知识点 前端-jquery知识点 Java设计模式之《抽象工厂模式》及使用场景 - 唯一浩哥 - 博客园 Java基础系列-Enum深入解析 - 唯一浩哥 - 博客园 Java基础系列-Collector和Collectors - 唯一浩哥 - 博客园 Java基础系列-Stream - 唯一浩哥 - 博客园 Java并发编程系列-AbstractQueuedSynchronizer - 唯一浩哥 - 博客园
Java基础系列-substring的原理 - 唯一浩哥 - 博客园
唯一浩哥 · 2019-05-08 · via 博客园 - 唯一浩哥

原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755235.html

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

图片来自网络

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

图片来自网络