美文网首页
Java8 API学习23 - java.lang.Append

Java8 API学习23 - java.lang.Append

作者: raBBtt | 来源:发表于2018-07-07 20:38 被阅读0次
final class StringBuffer extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence;

final class StringBuilder extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence

和很多文章说的一样, StringBuffer和StringBuilder的区别就在于是否是线程安全的, 两个类都继承于AbstractStringBuilder, 二者所包含的方法是相同的.

AbstractStringBuilder

注意, 这个抽象类是非public的, 这会带来一个小问题, 我们不能用一个类或接口同时接受StringBuffer和StringBuilder作为参数. 为什么要这么设计呢...

abstract class AbstractStringBuilder implements Appendable, CharSequence

Appendable接口

public interface Appendable

除了AbstractStringBuilder, 该接口的实现类还有java.nio.CharBuffer, java.io.PrintStream和java.io.Writer, 可以看出这个接口是用于字符/字符流拼接的. 其中只有一个方法append, 但是有3种重载方式

Appendable append(char c) throws IOException
Appendable append(CharSequence csq) throws IOException
//从csq中截取部分再执行添加操作
Appendable append(CharSequence csq, int start, int end) throws IOException

注意2个地方: 上述方法都会抛出IOException; 其返回值为Appendable.

StringBuilder的方法

其实二者的方法是相同的, 这里以StringBuilder为例来进行说明.

构造函数

每个StringBuilder实例中都有一个char数组存储字符; 类似于ArrayList, 如果长度不够那就会建一个新数组然后复制旧元素.
StringBuilder和StringBuffer的构造函数形式也是相同的.

StringBuilder() //默认capacity=16
StringBuilder(int capacity)
StringBuilder(CharSequence) //复制一个CharSequence
StringBuilder(String) //复制一个String. 和上面不重复吗?

StringBuilder的方法(50个)

注意, 下面方法的返回值如果是StringBuilder类型, 表示return this, 因此我们可以连续调用这些方法.
1.append(13个)

//Appendable接口其中的2个实现方法, 注意参数的意义
StringBuilder append(CharSequence)
StringBuilder append(CharSequence s, int start, int end) 

StringBuilder append(String)
StringBuilder append(StringBuffer)

/*添加参数的字符串形式, 虽然实现中是根据不同类型分别写的方法,
而不是简单调用String.valueOf();
参数类型没有short和byte, 如果传入这个类型的参数会当作append(int).*/
StringBuilder append(boolean)
StringBuilder append(int)
StringBuilder append(long)
StringBuilder append(float)
StringBuilder append(double)

StringBuilder append(char)
StringBuilder append(char[])
StringBuilder append(char[] str, int offset, int len) //注意参数的意义

StringBuilder append(Object) //调用append(obj.toString())
  1. insert(12个)
    在字符串中间插入, 所以方法和append是类似的, 少了传入StringBuffer的形式
StringBuilder insert(int, char)
StringBuilder insert(int, char[])
StringBuilder insert(int index, char[] str, int offset, int len)

StringBuilder insert(int, CharSequence)
StringBuilder insert(int, CharSequence s, int start, int end)

StringBuilder insert(int, String)

StringBuilder insert(int, boolean)
StringBuilder insert(int, int)
StringBuilder insert(int, long)
StringBuilder insert(int, float)
StringBuilder insert(int, double)
StringBuilder insert(int, Object)
  1. 其他方法(20个)
int length()
void setLength(int newLength) //变短截断, 变长用0补全

//注意length和capacity的区别: 前者是实际长度, 后者是当前数组可容纳的长度
int capacity() 
void ensureCapacity(int)
void trimToSize()

char charAt(int)
void setCharAt(int, char)

//注意在参数中传入了dst[]存入返回的结果
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 

StringBuilder delete(int start, int end)
StringBuilder deleteCharAt(int index)

int indexOf(String str)
int indexOf(String str, int fromIndex)
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)

//这个replace是把[start, end - 1]的部分用str替换, 和String.replace不一样
StringBuilder replace(int start, int end, String str)

StringBuilder reverse()

//实现CharSequence接口
CharSequence subSequence(int start, int end)

//这两个大概更常用
String substring(int start)
String substring(int start, int end)

String toString()
  1. codepoint相关(5个)
StringBuilder appendCodePoint(int)
int codePointAt(int)
int codePointBefore(int)
int codePointCount(int beginIndex, int endIndex)
int offsetByCodePoints(int index, int codePointOffset)

总结

StringBuilder和StringBuffer的实质就是对一个char数组的操作吧...

相关文章

网友评论

      本文标题:Java8 API学习23 - java.lang.Append

      本文链接:https://www.haomeiwen.com/subject/jvxguftx.html