博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String源码j简单分析
阅读量:5234 次
发布时间:2019-06-14

本文共 3586 字,大约阅读时间需要 11 分钟。

分析:

1、

private final char value[];String内部由这个char数组维护String的字符。首先String类用final修饰,不可继承,其次,value[]用 fianl修饰,代表引用不可变。    public String() {        this.value = new char[0];    }当调用无参构造方法时,将char数组初始化为char[0]。

 

2、 String中的codePoint

codePoint  举例来说: “我”->对应的codePoint 为十进制的25105->十六进制的6211->UNICODE编码表中的6211(“我”字在UNICODE编码表中对应的16进制数)

3、   

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

 

4、equals方法

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;    }

5、测试两个字符串区域是否相等。

public boolean regionMatches(int toffset, String other, int ooffset,            int len) {        char ta[] = value;        int to = toffset;        char pa[] = other.value;        int po = ooffset;        // Note: toffset, ooffset, or len might be near -1>>>1.        if ((ooffset < 0) || (toffset < 0)                || (toffset > (long)value.length - len)                || (ooffset > (long)other.value.length - len)) {            return false;        }        while (len-- > 0) {            if (ta[to++] != pa[po++]) {                return false;            }        }        return true;    }

 6、hashcode

返回此字符串的哈希码。 String 对象的哈希码根据以下公式计算:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用 int 算法,这里 s[i] 是字符串的第 i 个字符, n 是字符串的长度, ^ 表示求幂。(空字符串的哈希值为 0。)

public int hashCode() {        int h = hash;        if (h == 0 && value.length > 0) {            char val[] = value;            for (int i = 0; i < value.length; i++) {                h = 31 * h + val[i];            }            hash = h;        }        return h;    }

7、截取子串,返回的是new 的String

public String substring(int beginIndex) {        if (beginIndex < 0) {            throw new StringIndexOutOfBoundsException(beginIndex);        }        int subLen = value.length - beginIndex;        if (subLen < 0) {            throw new StringIndexOutOfBoundsException(subLen);        }        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);    }

8、字符串拼接,返回的时new String,所以不建议多次拼接,多次拼接请选StringBuffer

public String concat(String str) {        int otherLen = str.length();        if (otherLen == 0) {            return this;        }        int len = value.length;        char buf[] = Arrays.copyOf(value, len + otherLen);        str.getChars(buf, len);        return new String(buf, true);    }

9、valueOf方法要注意,如果传进来的字符串为null,则会自动new String("null")返回,否则返回对象.toString()

public static String valueOf(Object obj) {        return (obj == null) ? "null" : obj.toString();    }

10、intern()方法分析

返回字符串对象的规范化表示形式。

一个初始时为空的字符串池,它由类 String 私有地维护。

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

所有字面值字符串和字符串赋值常量表达式都是内部的。

返回:

一个字符串,内容与此字符串相同,但它保证来自字符串池中。

希望深入了解的看我的这篇文章:

 

 

最后附上看到的其他大手写的比较有深度的分析,随时补充自己的文章~~~

转载于:https://www.cnblogs.com/lige-H/p/7213995.html

你可能感兴趣的文章
iOS: 数据持久化方案
查看>>
Neo4j学习笔记
查看>>
Harbor私有仓库中如何彻底删除镜像释放存储空间?
查看>>
UVa 11549 Open Credit System
查看>>
【C#】【Thread】Monitor和Lock
查看>>
builder模式的新学习
查看>>
UVALive - 3635 - Pie(二分)
查看>>
生活中的五个球
查看>>
非静态内部类不能拥有静态变量 为什么
查看>>
android.os.NetworkOnMainthreadexception处理
查看>>
数据库复习⑥
查看>>
如何解决本地调试没问题,部署上去网页显示中文乱码的问题
查看>>
jQuery的中文乱码问题[转]
查看>>
内外网同时访问的路由配置
查看>>
CSS笔记---文字两边对齐
查看>>
程序员和青蛙公主
查看>>
[JSOI2008]最大数
查看>>
jQuery对象和Javascript对象
查看>>
【题解】 bzoj4004: [JLOI2015]装备购买 (线性基)
查看>>
java 字符深入知识,待整理
查看>>