分析Java中 CharSequence源码

java.lang.CharSequence 错误解决的艰难过程 大多数情况都是引入了不同版本的jdk,如果是这样,可以把其中一个给去掉。具体操作,可以参考如下链接: 项目实战—— 类型java.lang.charsequence不能解决(完美解决!) ps:看到自认为好的教程,与大家分享。 但是我的问题并不是这么简单的,从网上找的一个代码,运行起来。当我把jdk1.8降低到jdk1.6,会出现另一个问题: ... 阅读详情

CharSequence 定义

CharSequence 是 java.lang 包下的一个接口,是 char 值的可读序列, 即其本身描述的就是字符串。因此我们可以直接使用如下:

<pre class="prettyprint hljs dart" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">CharSequence cs1 = "朝雾轻寒";  // 默认实现为 String
CharSequence cs2 = new StringBuilder("朝雾轻寒");
CharSequence cs3 = new StringBuffer("朝雾轻寒");

扩展

char 数据类型是基于原始 Unicode 规范,Unicode 标准定义了合法代码点(code point)的范围是 U+0000 到 U+10FFFF,称为 Unicode scalar value 。其中从 U+0000 到 U+FFFF 的字符集称为 基本多语言平面 (BMP) ,码位大于 U+FFFF 的字符集称为补充平面。

一个 char 值表示基本多语言平面(BMP)代码点,可以是代理代码点或 UTF-16 编码的代码单元。一个 int 值表示所有 Unicode 代码点,包括补充代码点。低(最低有效)21 位 int 用于表示 Unicode 代码点,高(最高)11 位必须为零。

只接受 char 值的方法不支持补充字符。

CharSequence 提供了对多种不同类型的 char 序列的统一只读访问,它有如下的实现类,如 String 、 StringBuffer 、 StringBuilder 、 CharBuffer 类等。

此接口不修改 equals 和 hashCode 方法的常规协定。因此,通常未定义比较实现 CharSequence 的两个对象的结果。每个对象都可以通过一个不同的类实现,而且不能保证每个类能够测试其实例与其他类的实例的相等性。因此,使用任意 CharSequence 实例作为集合中的元素或映射中的键是不合适的。

方法

length()

该方法的作用是返回此字符序列的长度。长度是序列中 16 位 char 的个数。

<pre class="hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">int length();

charAt(int index)

该方法的作用是返回指定索引处的 char 值。索引范围从零到 length() - 1 ,与数组的索引一样。如果 char 索引指定的值是 surrogate,则返回代理值。

<pre class="hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">char charAt(int index);

注意:如果 index 超出索引范围,则会抛出 IndexOutOfBoundsException 异常。

subSequence(int start, int end)

该方法的作用是返回一个 CharSequence 序列的子序列。该子序列以 char 指定索引处的值开始,以索引处的 char 值结束 end - 1 。返回序列的长度(以 char 为单位)为 end - start ,因此如果 start == end 返回一个空序列。

<pre class="hljs sql" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">CharSequence subSequence(int start, int end);

注意:如果 start 或 end 超出索引范围,或者 start 大于 end ,则会抛出 IndexOutOfBoundsException 异常。

toString()

该方法是返回以与此序列相同的顺序返回包含此序列中字符的字符串。字符串的长度就是这个序列的长度。

<pre class="hljs delphi" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public String toString();

这是重写了 Object 方法, Object 类不需要显示的继承。

chars()

该方法在 JDK1.8 中加入,其作用是返回此序列中 int 值的零扩展流。 char 任何映射到 代理代码点 的字符都会未经解释地传递。如果在读取流时发生了突变,则结果是未定义的。

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public default IntStream chars() {
            // 实现了int原语迭代器
        class CharIterator implements PrimitiveIterator.OfInt {
            int cur = 0;
                        // 如果迭代器中还有元素,则返回true。
            public boolean hasNext() {
                return cur < length();
            }
                         // 返回迭代器中的下一个元素
            public int nextInt() {
                if (hasNext()) {
                    return charAt(cur++);
                } else {
                    throw new NoSuchElementException();
                }
            }
                         /* 对每个剩余元素执行指定的操作,直到所有元素。
               已被处理或动作引发异常。行动是
               按照迭代顺序执行,如果指定了该顺序。
               由操作引发的异常会传递给调用者。*/
            @Override
            public void forEachRemaining(IntConsumer block) {
                for (; cur < length(); cur++) {
                    block.accept(charAt(cur));
                }
            }
        }
                // 返回一个通过继承了 Spliterator.OfInt 的 Supplier 创建的新的顺序或并行 IntStream
        return StreamSupport.intStream(() ->
                // 创建一个拆分器,以 CharIterator 作为元素的源,同时报告初始元素数量,源或者元素的特征
                Spliterators.spliterator(
                        new CharIterator(),
                        length(),
                        Spliterator.ORDERED),
                Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED,
                false);
}

很多情况下,我们可以直接使用包装类如 Integer 直接进行数据处理,得益于 JDK1.5 中添加了自动装箱功能。但如果在内部循环中进行装箱或拆箱操作, 会带来大量 CPU 和垃圾回收机制的开销。

在 JDK1.8 中我们知道加入了 Stream 流支持,在设计 api 时充分考虑对原语支持,综合性能、开销、维护成本等,添加了对 int、long、double 的原语专门化.

codePoints()

该方法在 JDK1.8 中加入,其作用是返回此序列的一个代码点值流。在序列中遇到的任何代理对都是按字符组合的。 toCodePoint 和结果被传递到流。任何其他代码单元,包括普通的BMP字符、未配对的代理和未定义的代码单元,都是零扩展到int值,然后将这些值传递给流。 如果在读取流时发生了突变,则结果是未定义的。

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public default IntStream codePoints() {
        class CodePointIterator implements PrimitiveIterator.OfInt {
            int cur = 0;
                         /* 对每个剩余元素执行指定的操作,直到所有元素。
               已被处理或动作引发异常。行动是
               按照迭代顺序执行,如果指定了该顺序。
               由操作引发的异常会传递给调用者。*/
            @Override
            public void forEachRemaining(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;
                }
            }
                        // 如果迭代器中还有元素,则返回true
            public boolean hasNext() {
                return cur < length();
            }
                        // 返回迭代器中的下一个元素
            public int nextInt() {
                final int length = length();

                if (cur >= length) {
                    throw new NoSuchElementException();
                }
                char c1 = charAt(cur++);
                if (Character.isHighSurrogate(c1) && cur < length) {
                    char c2 = charAt(cur);
                    if (Character.isLowSurrogate(c2)) {
                        cur++;
                        return Character.toCodePoint(c1, c2);
                    }
                }
                return c1;
            }
        }
                // 返回一个通过继承了 Spliterator.OfInt 的 Supplier 创建的新的顺序或并行IntStream
        return StreamSupport.intStream(() ->
                Spliterators.spliteratorUnknownSize(
                        new CodePointIterator(),
                        Spliterator.ORDERED),
                Spliterator.ORDERED,
                false);
}

compare(CharSequence cs1, CharSequence cs2)

该方法在 JDK11 中加入,其作用是按字典顺序比较两个 CharSequence 实例。如果第一个序列按字典顺序分别小于、等于或大于第二个,则返回负值、零或正值。

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">public static int compare(CharSequence cs1, CharSequence cs2) {
    if (Objects.requireNonNull(cs1) == Objects.requireNonNull(cs2)) {
        return 0;
    }

    if (cs1.getClass() == cs2.getClass() && cs1 instanceof Comparable) {
        return ((Comparable<Object>) cs1).compareTo(cs2);
    }

    for (int i = 0, len = Math.min(cs1.length(), cs2.length()); i < len; i++) {
        char a = cs1.charAt(i);
        char b = cs2.charAt(i);
        if (a != b) {
            return a - b;
        }
    }

    return cs1.length() - cs2.length();
}

将长度为 len 的 CharSequence cs 视为 char 值的序列,从 cs[0] 到 cs[len-1] 。假设 k 是每个序列中对应的 char 值不同的最低索引。序列的字典顺序由 char 值 cs1[k] 与 cs2[k] 的数值比较确定。如果没有这样的索引 k ,则较短的序列在字典上被认为小于另一个。如果序列具有相同的长度,则认为这些序列在字典上是相等的。

java接口CharSequence源码分析 ​CharSequence是一个描述字符串结构的接口 CharSequence 定义 CharSequence是java.lang包下的一个接口,是 char 值的可读序列, 即其本身描述的就是字符串。因此我们可以直接使用如下: CharSequence cs1 = "朝雾轻寒"; // 默认实现为 String CharSequence cs2 = new StringBuilder("朝雾轻寒"); CharSequence cs3 = new StringBuffer("朝雾轻寒"...... 阅读详情

相关推荐

从JDK源码看StringBuffer

概况 Java 中处理字符串时经常使用的 String 是一个常量,一旦创建后不能被改变。为了提供可修改的操作,引入了 StringBuilder 类,可看前面的文章《从JDK源码看StringBuilder》。但它不是线程安全的,只用在单线程场景下。所以引入了线程安全的 StringBuffer 类,用于多线程场景。 总的来说主要是通过在必要的方法上加 synchronized 来实现线程安...

seaboat——a free boat on the sea.(公众号:远洋号) 944

JDK1.8源码学习--lang包(CharSequence)

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄! 一.CharSequence的作用: 直接看源码注释 /** * A <tt>CharSequen...

w5_Silence的博客 465

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 193

char在JAVA的哪个包里_包声明中无法解析类型java.lang.CharSequence

我在package中有2节课P。接口类A及其实现类B。在具有类的文件中,B出现以下错误:The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files。我正在使用Eclipse Helios和$ java -versionjava version "...

weixin_33158453的博客 329

立创开源便携式多生理参数监护仪:基于STM32H743与ADS1292R的心电血氧体温监测系统设计

本文详细解析了基于STM32H743与ADS1292R的便携式多生理参数监护仪开源设计。项目集成了心电、血氧和体温监测功能,采用模块化硬件架构,并重点介绍了利用FIR滤波和Pan-Tompkins算法进行心电信号处理的核心技术。文章提供了完整的复刻指南与避坑要点,是学习医疗电子设备设计的优秀实践案例。

weixin_30600615的博客 326

手把手教你用MATLAB和PSIM搞定Buck电路控制器:从传递函数到运放电路实战

本文详细介绍了如何使用MATLAB和PSIM协同设计Buck电路控制器,从传递函数推导到运放电路实现的完整流程。通过小信号建模、波特图分析和双平台仿真验证,帮助电力电子工程师解决理论到实践的转化难题,提升Buck电路控制器设计的效率和可靠性。

weixin_29271053的博客 267

java string jdk_java.lang.String (JDK1.8)

String类实现了java.io.Serializable, Comparable, CharSequence这三个interface。看了下这三个interface中的方法,发现CharSequence中在1.8版本jdk中新增了两个方法:1 public defaultIntStream chars(){...}2 public default IntStream codePoints() ...

weixin_33355385的博客 363

基于555定时器的呼吸灯电路

呼吸灯是指LED灯在芯片的控制下完成由亮到暗的逐渐变化,感觉就像人在呼吸,其广泛使用在手机上,起到一个通知提醒的作用。呼吸灯在许多灯光装饰上也有大量使用,如音响、汽车广告牌等,在生活中较为常见。...

qq1074237849的博客 9491

[转载]CharSequence类型

CharSequence类型这是一个接口,代表的是一个有序字符集合,这个接口包含的方法有:charAt(int index),toString(),length(),subSequence(int start,int end).这里需要说的一点就是,对于一个抽象类或者是接口类,不能使用new来进行赋值,但是可以通过以下的方式来进行实例的创建: CharSequence cs="hello...

weixin_34056162的博客 232

MS2107 CVBS转USB2.0 音视频采集芯片,支持1080P@30HZ输出

MS2107 是一款视频和音频采集芯片,支持CVBS转USB2.0 ;可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。

TEL18967112838的博客 2075

使用MATLAB结合EasySpin进行ESR模拟的详细步骤及示例代码

安装EasySpin:确保你已经安装了EasySpin工具箱,它可以帮助你进行ESR模拟。你可以从EasySpin的官方网站(https://easyspin.org/)下载并安装。准备实验数据:将实验得到的EPR数据整理成合适的格式,一般包含磁场(Magnetic Field)和信号强度(Intensity)两列。进行模拟:使用EasySpin的函数对单线态氧自由基和超氧自由基进行模拟。调整参数:通过调整模拟参数,使模拟得到的峰型和峰位置与实验数据尽可能匹配。导出数据。

AI的内部世界的博客 2004

String类源码分析

String类源码分析 源码版本为java8 文章目录String类源码分析源码解析源码片段心得 源码解析 实现Serializable接口,Comparable接口,CharSequence接口 Serializable 接口: 可序列化对象接口 接口内无函数 comparable 接口: 比较器接口 内有compareTo方法 CharSequence: 字符序列 length,...

xArcharQAQ的博客 212

10、智慧变电站 - 加载vue大屏元素(整体效果)

这一篇文章非常简单,但是也非常出效果阅读前面几篇文章,都可以看到有顶部、左侧、右侧的面板,主要我不会录gif图片,大屏元素面板还有一些动态加载的效果。 vue的transition标签 Vue 提供了 transition 的封装组件,可以给任何元素和组件添加进入/离开过渡;在进入/离开的过渡中,会有 6 个 class 切换:v-enter 、v-enter-active 、v-enter-to 、v-leave 、v-leave-active 、v-leave-to。我们正好使用这个特性来达到面板进入

github_39988036的博客 1037

Java String类源码

  String类的签名(JDK 8):   public final class String implements java.io.Serializable, Comparable<String>, CharSequence { }   String是不可变类,即String对象也是不可变对象。   这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生...

weixin_30298497的博客 193

Unity必学:Protobuf-net预编译实战

本文深入解析Unity项目使用Protobuf-net Precompile的必要性。作为高效跨平台序列化方案,Protobuf-net解决了Unity工程在网络同步、存档系统中的性能瓶颈,特别是针对iOS等AOT平台的兼容问题。通过预编译模式,将运行时反射转为静态代码生成,显著提升移动端性能表现,支持协议平滑升级,已成为大厂项目的标配方案。文章从原理、实践到多平台适配,全面展示了这一"序列化发动机"如何支撑现代Unity项目的数据传输需求。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 494

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java string 源码_Java-- String源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载本篇博文基于java8,主要探讨java中的String源码。首先,将一个类分为几个部分,分别是类定义(继承,实现接口等),全局变量,方法,内部类等等,再分别对这几个部分进行说明,这样到最后类的全貌也就比较直观了。一:实现接口。public final classStringimplements java.io.Serializable, Comp...

weixin_39944375的博客 209

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JDK8源码解析-String-修饰符及接口实现(一)

源码解析基于jdk1.8.0_261进行分析 前言 String类是java出山时,就带出来的兄弟,在1.0版本,就有String类的出现,但并没有现在的Api丰富,从jdk1.0(1996)到jdk1.8(2016)用了18年的时间,廉颇虽老尚能战也,String是Java语言的核心类,位于rt.jar下java.lang包中,它提供了字符串的比较、查找、截取、大小写转换等操作;Java语言为"+"连接符(字符串连接符)以及对象转换为字符串提供了特殊的支持,字符串对象可以使用”+"连接其他对象

聽海的聲音 325

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java string源码分析_Java String源码分析

String源码分析类结构public final class Stringimplements java.io.Serializable, Comparable, CharSequenceString类实现了Serializable可以被序列化String类实现了Comparable可以进行比较String类实现了CharSequence可以按下标进行相关操作并且String类使用final进行...

weixin_39797324的博客 198

【Java基础】String类的源码阅读(1)

今天看了String类的源码,深入学习java的知识。对于一些英文的注解不是非常的理解,不过在阅读了源码以后还是解决了部分的之前的疑惑,所以还是记录一下今天对于String类源码的阅读。 首先String类是位于java.lang包中的。 String实现了三个接口:           1.java.io.Serializable:表示序列化,是一个空的接口。因为没有声明任何方法,所以不需要...

tzc_xyh的博客 454

源码分析篇之String源码分析二

    前面已经分析过String源码为什么是不可变的,同时通过我们常用的String的相关的类StringBuffer和StringBuilder,我们可以发现String类中字段名被定义为了final类型,这样的话将只能被赋值一次。接下来,继续看String源码实现的接口 public final class String implements java.io.Serializab...

远方的博客 294

String为什么不可变

一、String源码分析 String在日常开发中的使用频率相当高,所以今天就要扒开String的外衣,看看它究竟为什么? 不可变性 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ... } 从代码中可以看到,String类由final关键字修饰,这也意为着String类不可被继承,创建后不能被修改。 String类同时实现了三..

summer_fish的专栏 178

String的equals方法和contentEquals方法

作用 两者都是用来比较字符串的值是否相等 区别 equals():比较基本类型内容是否相同,或引用类型的内容和类型是否相同 首先比较两个字符串的引用是否相同,如果相同则返回true,如果不相同,那么比较两个字符串每个位置对应的char值是否相同,相同返回true contentEquals():比较引用类型(类型可以不同)的内容是否相同,不能比较基本类型 直接比较两个字符串对应位置的char值是否相同,全都相同返回true 源码比较 equals()源码 public boolean equals(

技术小白 1185

java $字符串替换_Java8字符串替换方法梳理

我们在Java开发中,经常会应用到Java String中字符串替换的功能,但是,Java中字符串的替换,有多个API,而且和其他语言中的用法有所不同,发现之前的理解有偏差,在这里进行一下梳理。在Java中,主要有四个字符串替换的API,主要有:// 按字符替换,原来的字符替换为新的字符(会将所有的oldChar都替换为newChar)String replace(char oldChar, ch...

weixin_39944944的博客 3166

(Java基础篇)四、Java源码理解String、StringBuffer和StringBuilder

String特性不做具体分析,主要关注一下具体的源码以及有关于hash碰撞的问题。上图为String类结构图,Comparable接口主要要求实现类能够被Arrays.sort(),具体怎么实现可以看看源码1153行,核心代码就是比较每一个字符的大小。String还实现了CharSequence接口,该接口是char值的可读序列,提供对许多不同类型的字符序列的统一只读访问。

weixin_43021647的博客 135

Java源码通俗理解之String类(一)--实现接口,成员变量和构造方法

String类简介 String类应该是最频繁使用的类型之一,同时也是超重要的一个类,因为是final修饰的类,所以无法被继承,但他并不能阻止我们通过阅读代码吸收营养 实现接口 java.io.Serializable 这个接口只是一个表示启用序列化功能的许可证,如果要实现序列化功能实现一下就好,不用重写方法. Comparable 实现这个接口需要重写compareTo()方法,Compara...

飞奔大鸡腿的小锅 522
上一篇: Iptables防火墙limit模块扩展匹配规则
下一篇: Spring Boot 定义接口的方法是否可以声明为 Private?
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值