本来还想一边读一边做笔记,后来发现这些源码动辄数千行,我需要学习的又那么多…所以打算用随笔的形式稍作总结,以待回顾。
继承和实现
在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
(orStringBuffer
) class and itsappend
method.
concat, ‘+’, StringBuilder, StringBuffer,该用哪一个? 这里收集了一些Notes:
- 如果你非常非常追求性能,不需要考虑线程安全问题,JRE是1.5+,可以用StringBuilder,反之,请用StringBuffer。
- 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). - concat只能作用于两个字符串,而‘+’可以接受anything.
Anyway, 我觉得concat()并没有什么卵用….如果字符串只读不变用String是可以的,如果经常需要改变,就用StringBuilder(非线程安全)/StringBuffer(线程安全)。