CharSequence源码分析

摘要:
CharSequence是一个表示可读字符值序列的接口。该接口为多个字符序列提供了一个统一的只读通道。因为它是一个接口,所以不能通过new分配值。只能通过以下方法分配值:CharSequencecs=“ss”;该接口有四个通用方法和两个默认方法。

CharSequence是一个接口,表示一个char值的可读序列,此接口为多种char序列提供统一的、只读的通道。既然是接口,就不能通过new来进行赋值,只能通过以下方式赋值:

CharSequence cs = "ss";

该接口有4个常规方法和两个default方法(这两个暂时先不分析了)。

intlength();  
    char charAt(intindex);
    CharSequence subSequence(int start, intend);
    publicString toString();
     
     *
     * @return an IntStream of char values from thissequence
     * @since 1.8
     */
    public defaultIntStream chars() {
        class CharIterator implementsPrimitiveIterator.OfInt {
            int cur = 0;

            public booleanhasNext() {
                return cur <length();
            }

            public intnextInt() {
                if(hasNext()) {
                    return charAt(cur++);
                } else{
                    throw newNoSuchElementException();
                }
            }

            @Override
            public voidforEachRemaining(IntConsumer block) {
                for (; cur < length(); cur++) {
                    block.accept(charAt(cur));
                }
            }
        }

        return StreamSupport.intStream(() ->Spliterators.spliterator(
                        newCharIterator(),
                        length(),
                        Spliterator.ORDERED),
                Spliterator.SUBSIZED | Spliterator.SIZED |Spliterator.ORDERED,
                false);
    }
* * @return an IntStream of Unicode code points from thissequence * @since 1.8 */ public defaultIntStream codePoints() { class CodePointIterator implementsPrimitiveIterator.OfInt { int cur = 0; @Override public voidforEachRemaining(IntConsumer block) { final int length =length(); int i =cur; try{ while (i <length) { char c1 = charAt(i++); if (!Character.isHighSurrogate(c1) || i >=length) { block.accept(c1); } else{ char c2 =charAt(i); if(Character.isLowSurrogate(c2)) { i++; block.accept(Character.toCodePoint(c1, c2)); } else{ block.accept(c1); } } } } finally{ cur =i; } } public booleanhasNext() { return cur <length(); } public intnextInt() { final int length =length(); if (cur >=length) { throw newNoSuchElementException(); } char c1 = charAt(cur++); if (Character.isHighSurrogate(c1) && cur <length) { char c2 =charAt(cur); if(Character.isLowSurrogate(c2)) { cur++; returnCharacter.toCodePoint(c1, c2); } } returnc1; } } return StreamSupport.intStream(() ->Spliterators.spliteratorUnknownSize( newCodePointIterator(), Spliterator.ORDERED), Spliterator.ORDERED, false); }

测试:

packagecom.test;

public classTest {
    @org.junit.Test
    public voidtest(){
        CharSequence cs = "welcome";
        System.out.println("字符序列的长度:"+cs.length());
        System.out.println("截取第一位字符(原字符序列不改变):"+cs.subSequence(0, 2));
        System.out.println("字符序列转换成字符串表示:"+cs.toString());
        System.out.println("返回第一个字符:"+cs.charAt(6));
    }
}

结果:

CharSequence源码分析第1张

免责声明:文章转载自《CharSequence源码分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VC++ ListCtrl Report使用多线程多核编码优化思路_转载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NDK+MSYS2+Android sdk编译opencv源码

由于今天太晚了,详细笔记有空再记。     要添加的有ANDROID_ABI,这个根据需求添加自己需要的ABI          然后是ANDROID_STL,因为gunstl已经不被支持,这里使用c++_shared或c++_static都可以。    然后是ANDROID_STL,因为gunstl已经不被支持,这里使用c++_shared或c++_st...

RocketMQ源码 — 八、 RocketMQ消息重试

RocketMQ的消息重试包含了producer发送消息的重试和consumer消息消费的重试。 producer发送消息重试 producer在发送消息的时候如果发送失败了,RocketMQ会自动重试。 private SendResult sendDefaultImpl( Message msg, final Communication...

31 讲带你搞懂 SkyWalking

课程背景 2019年4月,SkyWalking 这款国人开源的 APM 监控工具,正式从 Apache 基金会的孵化器毕业成为顶级项目。 如今 Skywalking 增长势头强劲,社区活跃,中文文档齐全,没有语言障碍,支持多语言探针。同时,还支持 Dubbo、gRPC、SOFARPC 等等框架。这些优点,让 Skywalking 的使用者越来越多,比如我们...

Django-rest-framework --- 总结

目录 drf回顾总结 drf基础知识点 1.drf框架安装 安装 drf框架规矩的封装风格 drf请求生命周期 2.接口 3.restful接口规范 4.基于restful规范的原生Django接口 主路由:url.py api组件的子路由:api/url.py 模型层:model.py 后台层:admin.py 数据库迁移 视图层:vi...

wordpress源码解析-数据库表结构(转)

如果是一个普通的用户,不需要了解wordpress数据库的结构。但是,如果你正在写一个插件,你应该会对wordpress如何处理它的数据和关系感兴趣。如果你已经尝试使用已经存在的wordpress api 去访问你需要的数据,但不直接访问数据库的情况下,这是不可能的,WordPress的提供WPDB的类,使这项任务变得简单。 WordPress数据库的11...

从源码中学习设计模式系列——单例模式序/反序列化以及反射攻击的问题(二)

一、前言 这篇文章是学习单例模式的第二篇,之前的文章一下子就给出来看起来很高大上的实现方法,但是这种模式还是存在漏洞的,具体有什么问题,大家可以停顿一会儿,思考一下。好了,不卖关子了,下面我们来看看每种单例模式存在的问题以及解决办法。 二、每种Singleton 模式的演进 模式一 public classLazySingleton {...