写点什么

String 源码分析 (三)

作者:知识浅谈
  • 2022-10-29
    吉林
  • 本文字数:1990 字

    阅读完需:约 7 分钟


🍁 作者:知识浅谈,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 知识浅谈

发布于: 刚刚阅读数: 3
用户头像

知识浅谈

关注

公众号:知识浅谈 2022-06-22 加入

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

评论

发布
暂无评论
String源码分析(三)_string_知识浅谈_InfoQ写作社区