String对象是不可变得,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String。
每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。
String类最长用的方法是toString()和append()。
String s1="a";
String s2="b";
String s3="c";
String s=s1+s2+s3;相当于StringBuilder sb=new StringBuild();sb.append(s1);sb.appens(s2);sb.append(s3);sb.toString()返回给s。
StringBuilder:是线程不安全的,开销比较小
StringBuffer :线程安全,但是开销大
String类和StringBuffer类主要用来处理字符串,这两个类提供了很多字符串的实用处理方法。String类是不可变类,一个String对象所包含的字符串内容永远不会被改变。
StringBuffer类是可变类,一个StringBuffer对象所包含的字符串内容可以被添加或修改。
String类有一些构造方法:
String( ):构建一个内容为空的字符串“”。
String(String value):字符串参数指定字符串的内容。
String(char[ ] value):字符数组参数指定字符串的内容。
String(byte[ ] bytes):根据本地平台默认的字符编码。由字节数组构造一个字符串。
String类有以下常用方法:
length( ):返回字符串的字符个数
char charAt(int index):返回字符串中index位置上的字符,其中index的取值范围是0到字符串长度-1。
getChars(int srcBegin,int srcEnd,char dst[ ],int dstBegin):从当前字符串中拷贝若干字符到参数指定的字符数组dst[ ]中。从srcBegin位置开始取字符,到srcEnd-1位置结束,dstbegin为提取的字符存放到字符数组中的起始位置。如果参数dst为null,则会抛出NullPointerException。
equals(object str)和equalsIgnoreCase(object str):判断两个字符串对象的内容是否相同。两个方法区别在于,后者忽略大小写,前者区分大小写。
int compareTo(String str):按字典次序比较两个字符串的大小。如果源串较小,则返回小于0的值,相等返回0,否则返回大于0的值。
indexOf( )和lastIndexOf( ):在字符串中检索特定字符或子字符串。前者从首位查找,后者从末尾开始查找。如果找到,就返回匹配成功的位置,如果没找到,就返回-1。
concat(String str):把参数str字符串附加在当前字符串的末尾。
substring(int beginIndex):返回字符串的一个子字符串,从参数beginIndex开始到末尾。
substring(int beginIndex,int endIndex):返回字符串的一个子字符串,从参数beginIndex开始到endIndex-1结束。
String[ ] split(String regex):根据参数regex把原来的字符串分割为几个子字符串。
例如:String s= “i=j”;
s.split(“=”);//输出结果为ij。
replaceAll(String regex,String replacement):把源字符串中的regex替换为replacement。
replaceFirst(String regex,String replacement):仅把源字符串中的第一个regex替换为replacement。
trim( ): 把字符串首尾的空格删除。
String valueOf( ):把基本类型转换为String类型。
toUpperCase( )和toLowerCase( ):前者把字符串字母全部改为大写,后者把所有字符串改为小写。
"hello"与 new String("hello")的区别
1:String s1=“hello”;String s2=“hello”
hello为直接数,Java虚拟机把它作为编译时常量,在内存中只会为它分配一次内存,然后就可以重复使用,因此s1==s2
2:String s3=new Sting(“hello”);String s4=new String(“hello”)
每个new语句都会新建一个String对象,因此s1==s2结果为false。
(Tips:从提高程序性能的角度考虑,减少java虚拟机为对象分配内存及回收内存的次数,可以减轻Java虚拟机的负担,从而提高程序性能。因此如果在编程时就明确知道字符串的内容,应该用字符串直接数来为String类型变量赋值。)
StringBuffer类
构造方法:
StringBuffer( ):建立一个空的缓冲区,默认长度为16
StringBuffer(int length):建立一个长度为length的空缓冲区。
StringBuffer(String str):缓冲区的初始内容为字符串str,并提供了16个字符的空间供再次分配。
StringBuffer类有以下常用方法。
length( ):返回字符串的字符个数,与String类的length( )用法相同。
append( ):向缓冲区内添加新的字符串。
toString( ):返回缓冲区内的字符串。
charAt(int index):返回字符串中index位置的字符。
setCharAt(int index,char ch):在index位置放置字符ch。
getChars(int srcBegin,int srcEnd,char[ ] dst,int dstBegin):用法与Sting类的getChars( )方法相同。
substring( ):用法与String类的substring( )相同。
insert(int offset,String str):在字符串中的offset位置插入字符串str。
String类和StringBuffer类的不同
1:String类是不可变类,而StringBuffer是可变类。String对象创建后,它的内容无法改变。一些看起来能够改变的字符串的方法,实际上是创建一个带有方法所赋予特性的新字符串,。例如String类的substring( ),concat( ),toLowerCase( ),toUpperCase( )和trim( )等方法都不会改变字符串本身,而是创建并返回一个包含改变后内容的新字符串对象。
而StringBuffer的append( ),replaceAll( ),replaceFirst( ),insert( )和setCharAt( )等方法都会改变字符缓冲区中的字符串内容。
2:String类覆盖了Object类的equals( )方法,而StringBuffer类没有覆盖Object类的equals( )方法。
3:两个类都覆盖了Object类的toString( )方法,但是各自的实现方式不一样:String类的toString( )方法返回当前String实例本身的引用,而StringBuffer类的 toString( )方法返回一个以当前StringBuffer的缓冲区中的所有字符为内容的新的String对象的引用。
4:String类对象可以用操作符+进行连接,而StringBuffer类对象之间不能通过操作符+进行连接。
(Tips:例如在读取一行文本的情况下,使用StringBuffer可以减少java虚拟机创建String对象的次数,减少动态分配和回收内存的次数,提高程序的性能)
正则表达式
正则表达式用来描述特定的字符串模式,例如表达式 a{3} 表示由三个字符 a 构成的字符串,相当于普通字符串“aaa”。
特殊字符 描述
. 表示任意一个字符
// 反斜杠
/t 间隔 ('/u0009')
/n 换行 ('/u000A')
/r 回车 ('/u000D')
[abc] 表示a b c中的任意一个字符
[^abc] 表示除a b c以外的任意一个字符
[a-zA-Z] 介于a到z,或A到Z中的任意一个字符
\s 空白符(空格,tab,换行,换页,回车)
\S 非空白符
\d 任意一个数字[0-9]
\D 任意一个非数字[^0-9]
\w 词字符[a-zA-Z_0-9]
\W 非词字符
表示字符出现次数的符号
* 0次或者多次
+ 1次或者多次
? 0次或者1次
{n} 恰好n次
{n,m} 至少n次,不多于m次