String源码简析(未完成,待本周末更新)

类和接口

String类被定义成public final class,所以String类无法被继承。

String类实现了Serializabel、Comparabe、CharSequence三个接口,分别对应着序列化、排序、字符串处理三个方面的功能。

类属性

String类底层有固定长度的字符数组组成,用hash的方法缓存字符串,含有一个序列化ID以及一个用于序列化的ObjectStreamField类,这个类我们会单独拿出一篇文章来讲。

private final char value[];
private int hash;
private static final long seriaVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields =
            new ObjectStreamField[0];

类方法

构造方法

String构造数据的构造方法有很多实现方法。

默认构造方法

public String();

新建一个单个字符的char数组。常见于String str = new String();

带参构造方法

public String(String original);

String类型的传参直接赋值

public String(char value[]);

char数组则使用Arrays来直接拷贝,当然,可以在传参的时候,可以再加上位移量和长度(数量),详见String的源码

public String(int[] codePoint, int offset, int count);
public String(byte ascii[], int hibyte, int offset, int count);
public String(byte bytes[], Charset charset);
public String(byte bytes[], int offset, int length);
public String(byte bytes[]);

一些byte及编码类型的传参不再赘述。

public String(StringBuffer buffer);
public String(StringBuilder builder);

JDK1.5之后,String可以通过StringBuffer和StringBuilder调用Arrays.copyOf()来初始化String。其中,StringBuffer在调用的时候,会加锁以保证线程安全。

一般方法

字符操作length()isEmpty()charAt()codePointAt()codePointBefore()codePointCount()getBytes() 方法功能同名。

public boolean equals(Object anObject);
public boolean equalsIgnoreCase(String anotherString); // 大小写不敏感
  • String是final对象,所以在写equals方法时,是在比较String的各位char数值。
  • String是不可变对象,所以该方法没有涉及线程相关的设计。
public boolean contentEquals(StringBuffer sb);
public boolean contentEquals(CharSequence cs);
  • equals()方法只能比较String,而contentEquals的比较类型更多
  • contentEquals针对StringBuffer、StringBuilder、String、Charsequence有着不同的比较方法。
  • StringBuffer多加了一个synchronnized来保证线程安全。
  • contentEquals功能同名,只比较内容,而忽略类型。
public int compareTo(String anotherString);

按字典序列比较内容,返回不同字符处的距离或不同字符串长度,相等返回0

内部类 CaseInsensitiveComparator

我们发现内部类CaseInsensitiveComparator的compare比较方法为了实现大小写不敏感,把字符分别toUppperCasetoLowerCase比较了一遍,

一般方法

public boolean regionMatches(int toffset, String other, int ooffset,int len);
public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len);

比较两个字符串从某处开始的特定长度的字串是否相等。

public String concat(String str);

concact是拼接函数,其中为了设计char数组的拷贝,使用了传入String对象的getChars()方法。

void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, 0, dst, dstBegin, value.length);
}

在这个函数中,使用了System的arraycopy方法,把当前字符串拷贝到传入字符串数组的结尾。

最后,concat返回一个新的String对象

public String replace(char oldChar, char newChar) {
    if (oldChar != newChar) {
        int len = value.length;
        int i = -1;
        char[] val = value; / avoid getfield opcode /

        while (++i < len) {
            if (val[i] == oldChar) {
                break;
            }
        }
        if (i < len) {
            char buf[] = new char[len];
            for (int j = 0; j < i; j++) {
                buf[j] = val[j];
            }
            while (i < len) {
                char c = val[i];
                buf[i] = (c == oldChar) ? newChar : c;
                i++;
            }
            return new String(buf, true);
        }
    }
    return this;
}

replace方法用于返回一个替换字符串,但是这个方法重复执行了部分的循环操作。第一个循环用于找到第一个匹配的字符的位置,之后,再从头到此位置进行替换,最后从该位置之后再判断。这样做的目的是什么呢?

  • Java是高地址存低位,低地址存高
时间: 2025-01-30 11:20:45

String源码简析(未完成,待本周末更新)的相关文章

Java String源码解析

public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /**

【JDK源码分析】String的存储区与不可变性(转)

// ... literals are interned by the compiler // and thus refer to the same object String s1 = "abcd"; String s2 = "abcd"; s1 == s2; // --> true // ... These two have the same value // but they are not the same object String s1 = new

ym——android源码大放送(实战开发必备)

文件夹 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载更多源码.url │  目录列表.txt │   ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobileDemo1_1-master.zip │      Location1014.rar │ ├─anko │    

2014年1月优秀源码更新集锦

中介交易 SEO诊断 淘宝客 云主机 技术大厅 对于想做网站或者正在做网站的朋友来说,选择好的建站系统并及时的升级修复是不可缺少的,好的系统可以事半功倍,大大减少工作力度,及时的升级修复则可以更好的维护网站.A5源码(http://down.admin5.com/)为大家整理了部分上月更新的系统,其中包括:企业网站.CMS.团购.博客.社区论坛等. 社区论坛 bbPress 是WordPress团队开发的一个简约优雅的小型论坛.由于 bbPress 保持了体积小,重量轻,所以速度非常快. 在版本

java中的==、equals()、hashCode()源码分析

1. == java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: public class ComAddr{     public static void main(String[] args) throws Exception {         String s1 = "nihao";         String s2 = "nihao";         String s3 = new String("nihao")

竞价网站源码与SEO

导读:受产品利益的驱使,互联网上遍布各种各样的竞价网站.既是竞价网站,所以,较少有人谈到竞价网站的SEO问题.那么,竞价网站可以SEO吗?如果可以,又该如何来处理竞价网站源码才算SEO呢?龄毅网在这儿浅谈一下竞价网站源码与SEO的问题. 龄毅网截至目前为止,已经发布过两三百个竞价网站源码了,后面还将陆续发布更多的竞价网站源码,敬请需要竞价网站源码的朋友注意本站的更新啦! 受产品利益的驱使,互联网上遍布各种各样的竞价网站.既是竞价网站,所以,较少有人谈到竞价网站的SEO问题.那么,竞价网站可以SE

源码统计器1.1版

1.1版更新介绍 岁月如梭,光阴似箭,想不到离上次1.0版推出已有1年多时间^-^.在<源码统计器>推出的这一年内,许多朋友给我来信,指出其中的不足,并有许多很好的建议和鼓励,特别要感谢如下几位:Johnson Jiang.zhangxiao.jp.xie.佟晓艺.徐雷.xwing.司徒达擎.ltzhou.Hunter.birdie. 由于过去的一年多时间内工作很忙,而且我目前从事的已不再是软件开发类的工作,因此一直无暇更新.今年春节假期终于得到几天空闲,能够将自己以往的思路重新整理一下,对&

Linux基本配置和管理 7 软件安装:源码和Tarball

一 开放源码的软件安装和升级简介 1 Linux上面的软件几乎都是经过GPL的授权,所以每个软件几乎均提供源代码,并且你可以自行修改 程序代码 2 在Linux系统上面,一个文件能不能被执行看的是有没有可执行的那个权限(具有x权限),不过 Linux上面真正识别的可执行文件其实是二进制文件,例如/usr/bin/passwd 3 程序代码文件其实就是一个一般的纯文本文件,在完成这个源码文件的编写之后,再来就是要将这 个文件"编译"成为操作系统看的懂的二进制文件,而要编译自然要写&quo

A5源码:2014年7月源码更新整理

中介交易 SEO诊断 淘宝客 云主机 技术大厅 A5源码专注于服务中国站长,为众多源码爱好者提供方便.同以往相同,本月依然为您整理了上月部分源码的更新情况.2014年7月主要针对社区论坛.博客系统.企业建站.CM系统等几个类别为您整理了源码更新动态;下面来看下这些源码具体的功能增加.bug修复.系统优化吧... 企业网站源码 MetInfo企业网站管理系统是一款完全针对企业而设计的具有简单易用.功能强大,性价比高.扩展性好,安全性高.稳定性好的建站系统,可以加快企业网站开发的速度和减少开发的成本