String源码分析(三)

举报
知识浅谈 发表于 2022/10/28 09:42:46 2022/10/28
【摘要】 String源码分析(三)

在这里插入图片描述

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈

String源码分析(三)总结
🤞这次都给他拿下🤞

正菜来了⛳⛳⛳

🎈String类中的相关函数解析

🍮getChars(char dst[], int dstBegin)

含义:这个函数的主要作用就是吧String中的数组赋值到dst数组中,其内部调用System.arraycopy这个函数进行实现,关于这几个参数的不同意思。

  • value: 源数组
  • 0:源数组开始的位置。
  • dst:目标数组,即要复制到目标数组中。
  • dstBegin:目标数组开始的位置。
  • value.length:要拷贝的字符串的长度。
void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, 0, dst, dstBegin, value.length);
}

🍮void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)

含义:这个函数的主要作用和上边的函数差不多,主要是就是这个指定了源数组开始的位置和结束的位置,并且指定目标数组和目标数组开始的位置。

public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
    if (srcBegin < 0) {
        throw new StringIndexOutOfBoundsException(srcBegin);
    }
    if (srcEnd > value.length) {
        throw new StringIndexOutOfBoundsException(srcEnd);
    }
    if (srcBegin > srcEnd) {
        throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
    }
    System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}

🍮void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin)

含义:这个函数的意思和上边的差不多,这个就是把String底层的指定开始和结束位置的字符拷贝到指定开始位置的目标字节数组中。

public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) {
    if (srcBegin < 0) {
        throw new StringIndexOutOfBoundsException(srcBegin);
    }
    if (srcEnd > value.length) {
        throw new StringIndexOutOfBoundsException(srcEnd);
    }
    if (srcBegin > srcEnd) {
        throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
    }
    Objects.requireNonNull(dst);

    int j = dstBegin;
    int n = srcEnd;
    int i = srcBegin;
    char[] val = value;   /* avoid getfield opcode */

    while (i < n) {
        dst[j++] = (byte)val[i++];
    }
}

🍮byte[] getBytes(String charsetName)

含义:使用命名字符集将此字符串编码为字节序列,并将结果存储到新的字节数组中。未指定此字符串无法在给定字符集中编码时此方法的行为。当需要对编码过程进行更多控制时,应使用 java.nio.charset.CharsetEncoder 类。
通俗解释:这个函数的意思就是把String字符串按照指定的编码方式进行编码,并且返回一个字节数组。

 public byte[] getBytes(String charsetName)
         throws UnsupportedEncodingException {
     if (charsetName == null) throw new NullPointerException();
     return StringCoding.encode(charsetName, value, 0, value.length);
 }

上边采用到了两个非String中的方法,我们也来分析一下。

🍮byte[] encode(Charset cs, char[] ca, int off, int len)

含义:这个函数的意思是把String字符串按照指定的charset指定的格式进行编码为一个字节数组,并返回,这个和上边的函数比较相似,会采用StringCoding.encode这个函数进行编码。

🍮byte[] encode(char[] ca, int off, int len)

含义:这个和之前的很像,只不过没有传输指定的编码格式,而是采用默认的编码格式进行编码,代码中有一段代码String csn = Charset.defaultCharset().name();这个是采用默认的CharSet的编码格式。

🍮boolean equals(Object anObject)

含义:这个函数主要是用于判断当前的String对象是否等于传入的Object对象,先通过使用== 判断引用是否相同,如果相同,直接返回true,否者就把两个对象的数组一个一个字符的比较,当相同的时候,就返回true,否则返回false。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

🍚总结

以上是关于String中相关函数的解析,希望有所帮助。Written By 知识浅谈

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。