Java-0006-String、StringBuffer、St
2016.7.14
String 字符串常量
String是一个对象不是基本类型
是不可变对象,一旦创建就不能修改它的值
对于已存在的String对象操作都是创建一个新的String,并赋值新的值
String、StringBuffer和StringBuilder都是final类,不能被继承
而String的各种拼接操作都是通过StringBuffer来完成的
String s = "Hello";//s引用静态区的字符串字面量
String s = new String("Hello");//s引用堆上的字符串对象
创建,拼接
(+),concat
索引
indexOf、lastIndexOf
以开头/结尾
startsWith、endWith
获取指定位置的字符
charAt()
获取子字符串
substring(int,int)
比较
equals(String)和compareTo(String)
匹配
indexOf(String)和lastIndexOf(String)
修减两边空白
trim()
替换
replace(String,String)和replaceAll(String,String)
拆分
split(String)
StringBuffer和StringBuilder字符串变量
//更快,比String快几百至几千倍
StringBuffer//适用于多个线程操作同一个字符串的场景
StringBuilder//适用于单线程环境
//StringBuilder更快
StringBuffer
//线程安全,需同步,可能会需要等待
是一个可变对象,对它修改是不会创建新的对象
它只能通过构造函数创建,不能赋值
创建后内存会分配给它内存空间,并初始保存一个null
想要赋值是可以用它的append()方法
内存空间--字符串缓冲区,若溢出Java将自动扩充
StringBuffer sb = new StringBuffer();
sb.append("hello");
也可以构造时传入初始值
StringBuffer sb = new StringBuffer("hello");
StringBuffer比String高效的原因,
String str = new String("hello");
str+="hi";
的操作步骤实际上是创建一个StringBuffer,然后调用append方法,再调用toString方法赋值给str
String比StringBuffer多了很多附加步骤,所以很慢
StringBuilder
//线程不安全,不需同步,不需要等待,会比StringBuffer更快
StringBuilder与StringBuffer相似
该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
//在指定位置插入字符串
insert(int ,String)
//删除指定位置字符串
delete(int ,int)
//倒转
reverse()
一个完整的Unicode字符叫代码点CodePoint,而一个Java char叫代码单元code unit。如果String 对象以UTF-16保存 Unicode 字符,需要用2个字符表示一个超大字符集的汉字,这这种表示方式称之为 Surrogate,第一个字符叫Surrogate High,第二个就是Surrogate Low。
代码点(Code Point)就是指Unicode中为字符分配的编号,一个字符只占一个代码点,例如我们说到字符“汉”,它的代码点是U+6C49.代码单元(Code Unit)则是针对编码方法而言,它指的是编码方法中对一个字符编码以后所占的最小存储单元。 例如UTF-8中,代码单元是一个字节,因为一个字符可以被编码为1个,2个或者3个4个字节;在UTF-16中,代码单元变成了两个字节(就是一个 char),因为一个字符可以被编码为1个或2个char(你找不到比一个char还小的UTF-16编码的字符,嘿嘿)。说得再罗嗦一点,一个字符,仅仅对应一个代码点,但却可能有多个代码单元(即可能被编码为2个char)。
//上面这段是copy来的,还不是很理解
//追加
append(String)
System.currentTimeMilis//当前时间
字符串操作注意
toCharArray()
可以将一个字符串返回成一个字符数组,配合for循环可以很好的操作字符
replace(String,String)、replaceFirst(String,String)、replaceAll(String,String)
则3个可以用来替换字符串,其中replaceFirst(String,String)、replaceAll(String,String)第一个参数的String并不是一般的字符串,它需要转义来通过正则表达式
例如你想匹配一个"+",你就需要输入"+"的转义字符"\+",但"\"也是需要转义的,就变成了"\\+"
split(String)
拆分函数的参数也需要转义
另外拆分完的数组也很有趣,例如String[ ] arr = str.split(word);
当str和word字符串内容相同时,arr.length为0
当str比word长,并且str以word结尾时,arr.length为1
但当str比word长,并且str以word开头时,arr.length为2