String源码阅读

来源:互联网 发布:青山知可子女机械人bt 编辑:程序博客网 时间:2024/05/23 00:02

本来还想一边读一边做笔记,后来发现这些源码动辄数千行,我需要学习的又那么多…所以打算用随笔的形式稍作总结,以待回顾。

继承和实现

在java中,所有的类都隐式继承于Object,所以开头并没有出现诸如extends Object之类(毕竟每个类只能extends一个父类,当然要除Object之外)。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence
可见String实现了Serializable接口(序列化/反序列化),Comparable接口(排序/比较),CharSequence接口(字符序列).

  • char value[] //可见String的本质就是字符数组
  • int offset //起始下标
  • int count //字符个数
  • int hash //哈希code
  • long serialVersionUID //反序列化时通过它来确定类

构造方法

最经典的几种:
- (String anotherStr)
- (char[] characters)
- (byte[] bytes, Charset charset) //解码
- (StringBuffer buffer) //线程安全的,调用其toString()方法
- (StringBuilder builder) //调用其toString()方法

其他方法

  • int length() //count就是起这个作用啦
  • boolean isEmpty() //还是count的功劳
  • char charAt(int index) //已知下标,访问value[]数组
  • void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) //复制子串到一个char数组的某个位置
  • byte[] getBytes(Charset charset) //编码
  • boolean equals(Object anObject) //比较两个字符串的内容是否相等,’==’只能得到它们的地址/引用是否相同
  • int compareTo(String anotherStr) //重写的Comparable的方法,用于比较大小,大于another则返回正值
  • int compareToIgnoreCase(String anotherStr) //(忽略大小写)比较大小,通过构建一个新的比较器类,实现了Comparator接口中的compare方法。自己写排序规则也要这样。

  • boolean regionMatches(boolean ignoreCase, int toffset, String another, int ooffset, int len)//判断两个字符串某段子串是否匹配,ignoreCase决定是否考虑大小写

  • …略去一些,再列几个
  • String subString(int beginIndex, int endIndex)
  • String concat(String str) //new了新的字符串,和’+’相比时性能怎样?
  • String replace(char old, char new) //还有两个方法,replaceFirst(),replaceAll(),二者都是通过正则表达式去匹配,适用性还蛮广的
  • boolean contains(CharSequence s) //调用了String的indexOf方法,在indexOf中并没有使用字符串匹配中的KMP算法(经验证大部分情况下KMP并不是性能最优,反而带来很多计算负担)
  • String[] split(String regex)
  • String toLowerCase()
  • String toUpperCase()
  • String trim() //去掉头尾的空格
  • char[] toCharArray()//得到对应的字符数组

静态方法

  • String valueOf(Object obj) //一般通过调用obj自身的toString()方法,obj为字符数组则直接用new一个字符串
  • String copyValueOf(char data[], int offset, int count)

运算符重载

The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method.

concat, ‘+’, StringBuilder, StringBuffer,该用哪一个? 这里收集了一些Notes:

  1. 如果你非常非常追求性能,不需要考虑线程安全问题,JRE是1.5+,可以用StringBuilder,反之,请用StringBuffer。
  2. str1 += str2 is equivalent to doing the following:
    str1 = new StringBuilder().append(str1).append(str2).toString();
    By contrast, str1.concat(str2) simply makes a new string that’s the concatenation of str1 and str2, which is less expensive for a small number of concatenated strings (but will lose to the first approach with a larger number).
  3. concat只能作用于两个字符串,而‘+’可以接受anything.

Anyway, 我觉得concat()并没有什么卵用….如果字符串只读不变用String是可以的,如果经常需要改变,就用StringBuilder(非线程安全)/StringBuffer(线程安全)。

0 0
原创粉丝点击