• Home
  • Archives
  • 随笔
所有文章 友链 关于我

  • Home
  • Archives
  • 随笔

string源码系列-2

发布于: 2019-05-29
更新于: 2023-07-09

String

编码

UTF8

UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 的可变长度字符编码, 也是一种前缀码。 它可以用来表示 Unicode 标准中的任何字符, 且其编码中的第一个字节仍与 ASCII 兼容, 这使得原来处理 ASCII 字符的软件无须或只须做少部分修改, 即可继续使用。
UTF-8 使用一至六个字节为每个字符编码(尽管如此, 2003 年 11 月 UTF-8 被 RFC 3629 重新规范, 只能使用原来 Unicode 定义的区域, U+0000 到 U+10FFFF, 也就是说最多四个字节)

— wiki

latin1

ISO 8859-1, 正式编号为 ISO/IEC 8859-1:1998, 又称 Latin-1 或“西欧语言”, 是国际标准化组织内 ISO/IEC 8859 的第一个 8 位字符集。 它以 ASCII 为基础, 在空置的 0xA0-0xFF 的范围内, 加入 96 个字母及符号, 藉以供使用附加符号的拉丁字母语言使用。

— wiki

方法解释

indexOf()

检查边界、 编码, 然后从 fromIndex 迭代找出相等的, 然后返回下标 index

public static int indexOf(byte[] value, int ch, int fromIndex) {
    if (!canEncode(ch)) {
        return -1;
    }
    int max = value.length;
    if (fromIndex < 0) {
        fromIndex = 0;
    } else if (fromIndex >= max) {
        // Note: fromIndex might be near -1>>>1.
        return -1;
    }
    byte c = (byte)ch;
    for (int i = fromIndex; i < max; i++) {
        if (value[i] == c) {
            return i;
        }
    }
    return -1;
}

subString()

检查边界, 然后以给定的边界值创建新的对象, 对象创建时最后是用 Arrays.copyOfRange 来实现的

public String substring(int beginIndex, int endIndex) {
    int length = length();
    checkBoundsBeginEnd(beginIndex, endIndex, length);
    int subLen = endIndex - beginIndex;
    if (beginIndex == 0 && endIndex == length) {
        return this;
    }
    return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)
                        : StringUTF16.newString(value, beginIndex, subLen);
}

public static String newString(byte[] val, int index, int len) {
    return new String(Arrays.copyOfRange(val, index, index + len),
                        LATIN1);
}

replace()

pattern 就不做多介绍了,以后再分析下 pattern 是如何实现匹配的

public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
string源码系列-2
/archives/717a72/
作者
tyrantqiao
发布于
2019-05-29
更新于
2023-07-09
许可协议
CC BY-NC-SA 4.0
赏

蟹蟹大佬的打赏,大家一起进步

支付宝
微信
  • java
  • 源码

扫一扫,分享到微信

微信分享二维码
django后台的搭建
Linux常用指令及介绍
© 2024 tyrantqiao 本站总访问量次 本站访客数人次 载入天数...载入时分秒...
  • 所有文章
  • 友链
  • 关于我

tag:

  • 复盘
  • 我
  • 规划
  • java
  • 面试
  • 源码
  • 架构
  • Hadoop
  • HTTP
  • TCP
  • 学习笔记
  • IDEA
  • maven
  • idea
  • Java
  • jdk
  • 面经
  • linux
  • 爱情
  • mysql
  • 性能
  • sql
  • Mysql
  • JAVA
  • 技术
  • Redis
  • MQ
  • Spring
  • 数据库
  • TIDB
  • spring
  • unity
  • chatgpt
  • 经验分享
  • 前端
  • redis
  • vue
  • git
  • shadowsocks
  • hexo
  • blog
  • bug
  • 开发
  • 业务
  • jvm
  • 算法
  • MySQL
  • nginx
  • Linux
  • mq
  • db
  • springCloud
  • ssh
  • python
  • 爬虫
  • test
  • vim
  • 影视剧
  • 中间件
  • 事务
  • 性格
  • 音乐
  • 程序员
  • 随笔
  • mybatis
  • 演讲
  • 域名
  • 猫咪
  • 她
  • github
  • 计划
  • 旅游
  • 软件
  • 心理
  • 情商
  • 幽默
  • 才艺
  • 穿搭
  • 编程
  • 排序
  • 查找
  • 缓存
  • 网络
  • 设计模式
  • c
  • 课程设计
  • centos
  • 数学
  • 本网站主题yilia设计者的主页
如果有问题或者想讨论的可以联系[email protected]或者[email protected]