• Home
  • 归档
文章检索 作品与友邻 关于我
暴君乔博客
Home 归档

string源码系列-2

发布于: 2019-05-29
更新于: 2023-07-09
文章目录
  1. String
    1. 编码
    2. 方法解释

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常用指令及介绍
© 2026 tyrantqiao 本站总访问量次 本站访客数人次 载入天数...载入时分秒...
  • 文章检索
  • 作品与友邻
  • 关于我

展开标签

  • 随笔
  • 旅行
  • Java
  • 面经
  • 源码
  • 计算机网络
  • 技术
  • 架构
  • Hadoop
  • IDEA
  • maven
  • JDK
  • Linux
  • MySQL
  • 性能
  • 数据库
  • Redis
  • MQ
  • Spring
  • SquirrelFin
  • 记账
  • Android
  • 个人财务
  • unity
  • TIDB
  • chatgpt
  • 前端
  • Vue
  • Git
  • Hexo
  • shadowsocks
  • 问题排查
  • 业务
  • JVM
  • 算法
  • nginx
  • ssh
  • Python
  • 爬虫
  • test
  • vim
  • 影视剧
  • 中间件
  • 事务
  • 表达
  • 运动
  • mybatis
  • AI
  • 产品
  • 家装
  • 土巴兔
  • 域名
  • github
  • 软件
  • 个人项目
  • Leaves
  • Chrome
  • 浏览器插件
  • 开源
  • Balance Voice
  • 穿搭
  • 幽默
  • 画画
  • 缓存
  • 摄影
  • c
  • 课程设计
  • 调酒
  • 设计模式
  • 数学

Collection

作品与友邻

我做的小工具、朋友的站点和一些长期值得回访的灵感来源。

  • 土 土巴兔 AI 导购交互演示 可点击体验用户导购、平台运营、装修公司、材料商及 AI 话术知识库的多端增长流程。 /demos/tubatu-ai-guide/
  • L Leaves 行程记录 我做的行程记录页面小工具,用来沉淀旅行路线、日程安排和途中的灵感。 https://leaves.tyrantqiao.com/
  • 本 本网站主题yilia设计者的主页 http://litten.me/
tyrantqiao的头像

tyrantqiao

github rss qq mail facebook linkedin

About

关于我

代码、海浪和持续折腾,都是生活的一部分。

<div class="aboutme-card"> <p class="aboutme-eyebrow">tyrantqiao</p> <h3>Java 全栈开发</h3> <p>常年和 Java、后端服务、前端工程、数据与部署打交道,喜欢把复杂问题拆开、写清楚,也把踩坑过程整理成文章留给后来的人。</p> <div class="aboutme-tags"> <span>Java</span> <span>Full Stack</span> <span>Backend</span> <span>Frontend</span> <span>Extreme Sports</span> </div> <p>工作之外偏爱冲浪等极限运动,享受在浪上找平衡,也享受在代码里找边界。</p> <div class="aboutme-contact"> <a href="mailto:[email protected]">Gmail</a> <a href="mailto:[email protected]">QQ Mail</a> </div> </div>