博客
关于我
源码解读-java中String类的substring方法
阅读量:154 次
发布时间:2019-02-28

本文共 2457 字,大约阅读时间需要 8 分钟。

Java中的String.substring方法深入解析

在Java编程中,字符串操作是非常频繁的,一种常见的操作是提取字符串的子串。Java的String类提供了substring方法用于实现这一功能。本文将深入分析String.substring方法的实现原理及其在JVM中的优化机制。

1. substring方法的基本功能

String.substring方法主要有两种版本:

  • substring(beginIndex, endIndex):返回从beginIndex到endIndex-1的子串。
  • substring(beginIndex):返回从beginIndex到字符串末尾的子串。
  • 这里我们将重点分析第一种版本。

    2. 方法实现概述

    在源码中,substring方法的实现逻辑如下:

    public String substring(int beginIndex, int endIndex) {    if (beginIndex < 0) {        throw new StringIndexOutOfBoundsException(beginIndex);    }    if (endIndex > value.length) {        throw new StringIndexOutOfBoundsException(endIndex);    }    int subLen = endIndex - beginIndex;    if (subLen < 0) {        throw new StringIndexOutOfBoundsException(subLen);    }    return (beginIndex == 0 && endIndex == value.length) ? this : new String(value, beginIndex, subLen);}
    3. 异常检查
  • beginIndex检查:确保beginIndex不小于0。如果小于0,抛出StringIndexOutOfBoundsException。
  • endIndex检查:确保endIndex不超过字符串的长度。如果超过,抛出异常。
  • 子串长度检查:计算子串长度subLen,确保其不小于0。如果小于0,抛出异常。
  • 4. 返回逻辑
    • 如果beginIndex为0且endIndex等于字符串长度,则直接返回原字符串this。
    • 否则,创建一个新的String对象,使用子数组构造新字符串。
    5. new String(value, beginIndex, subLen)的作用
    • value:原字符串的字符数组。
    • beginIndex:子数组的起始位置。
    • subLen:子数组的长度。

    通过新建String对象,JVM会执行以下操作:

  • 数组复制:使用Arrays.copyOfRange方法从原数组中复制子数组到新字符数组中。
  • 构造新字符串:调用String的构造函数,初始化新字符串的value数组为复制后的字符数组。
  • 6. JVM优化机制

    在Java中,字符串是不可变的,因此每次修改都需要新建一个新的String对象。为了提高性能,JVM使用了**字符串常量池(String Constant Pool)**来缓存频繁使用的字符串。

    6.1 字符串常量池的作用
    • 当一个字符串被多次使用时,JVM会将其存储在字符串常量池中,避免重复实例化。
    • 如果字符串不存在于常量池中,则会实例化一个新的String对象,并将其存入常量池。
    6.2 String实例化过程

    当调用String s = "dsajhfkjhfsa";时,JVM首先检查常量池:

    • 如果常量池中存在该字符串,直接返回引用。
    • 如果不存在,实例化一个新的String对象,并将其存入常量池。

    7. String对象的内部结构

    String类内部使用一个final的char数组value来存储字符。由于char数组是不可变的,任何字符串操作都需要复制字符数组生成新的String对象。

    7.1 Arrays.copyOfRange的作用

    该方法用于复制原数组的子数组到新数组中。具体实现如下:

    public static char[] copyOfRange(char[] original, int from, int to) {    int newLength = to - from;    if (newLength < 0) {        throw new IllegalArgumentException(from + " > " + to);    }    char[] copy = new char[newLength];    System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength));    return copy;}
    7.2 复制过程
    • 确定新数组的长度为to - from
    • 复制原数组中的从from到to-1的字符到新数组中。
    • 如果from接近最大值,可能导致整数溢出,需谨慎处理。

    8. 性能优化

    通过分析可以看出,字符串的操作通常涉及内存分配和数组复制,这些操作对性能有显著影响。JVM的优化机制,如字符串常量池和数组复制算法,帮助提升了字符串操作的效率。

    9. 总结

    • substring方法:用于提取字符串的子串,确保输入参数有效。
    • 异常检查:防止越界操作,保障程序的稳定性。
    • 新建String对象:复制字符数组生成子串,确保原字符串不可变。
    • JVM优化:通过字符串常量池和数组复制算法,提升性能和内存使用效率。

    理解这些机制有助于更好地利用Java字符串操作,避免性能瓶颈。在实际开发中,应尽量使用重用已存在的字符串,避免不必要的对象创建。

    转载地址:http://ilyc.baihongyu.com/

    你可能感兴趣的文章
    nginx负载均衡的五种算法
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NHibernate学习[1]
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>