java源码学习一:String源码

  1.     final类,说明不可修改,因为java采用了反射机制,所以加载核心类不能出错,用final更安全
  2. 实现接口 java.io.serailizalbe charSequence字符序列,主要方法包括charAt(),length()等, comparable比较器 serializable只是一个标识,没有任何定义也没有任何实现方法http://www.aichengxu.com/article/Java/24680_2.html
  3. 成员:字符数组char[],hash值,serialVersionUID,ObjectStreamField(用来描述序列化对象的字段)
  4. 构造方法多个构造方法,如String,字符数组,StringBuffer,Stringbuilder,都是调用Arraycopy的方法,用codePoints构造,codePoint是Unicode中的码位,因为Unicode的部分字符java的一个char无法表示,需要用到2个char,所以遍历codePoint数组(int类型),如果是>0x10000,就长度++,最后转成char数组;其他构造还包括byte数组(需要指定特定字符集,否则报错),会调用Stringcode的decode方法,先采用本机默认字符集,其次是ISO-8859-1编码,即latin-1编码
  5. 接着是字符串的一些常用方法,包括长度,截取,以及编码的转换,如String转byte,
  6. String重写了equals方法,先判断1引用是否相等2是否字符串instanceof3长度是否相等4逐个比较字符,但是实现方式有点奇怪: int i=0;
        while(n--!=0){
        if(v1[i]!=v2[i])
        return false;
        }
        return true;
        显然它循环时候操作了两个变量,为什么不用一个?其它的也是
  7. 与StringBuffer和StringBuilder的对比,从这里看出两者线程安全不同
  8. ignoreCase的比较会将字母都转化为大写字母,但是由于德国字母表有问题,所以得转成小写字母再比一次
  9. 字符串寻找匹配:
  10. hashCode关键代码:h = 31 * h + val[i]
  11. subString,concat就很简单了,直接构造,
  12. 为了增强String的功能,String带有一些正则匹配功能,都是调用java的regex包
  13. split功能很有趣,先看javadoc给出的例子: "boo:and:foo"
    Regex Limit Result
    : 2 { "boo", "and:foo" }
    : 5 { "boo", "and", "foo" }
    : -2 { "boo", "and", "foo" }
    o 5 { "b", "", ":and:f", "", "" }
    o -2 { "b", "", ":and:f", "", "" }
    o 0 { "b", "", ":and:f" }
    When there is a positive-width match at the beginning of this string then an empty leading substring is included at the beginning of the resulting array. A zero-width match at the beginning however never produces such empty leading substring.  If  n  is non-positive then the pattern will be applied as many times as possible and the array can have any length.  If  n  is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.
总结而已,结尾的空串会被抛弃(如果limit是0),否则都会包括。匹配后会有一个空串在切割的子串前面
具体实现机制 public   String []  split ( String   regex int   limit )
1首先判断regex是否是一个普通字符或转义字符,是就快速匹配
2建立ArrayList<String>,通过不断indexOf来匹配,并且substring
3如果limit为0,就将list的结尾的空串删去

14.String的join函数调用String Stringjoiner,Stringjoiner在java.util包
通过StringBuilder调用add加上分隔符和newElement
15.tolowerCase,toUpperCase
16.trim 去除两边的空格,采用先遍历两边的空格,记录位置,再调用substring
17格式化,构造formatter
18valueOf,将char等各种数据类型转化成String类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值