String源码分析(三)

108 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情 在这里插入图片描述

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