Java中的字符串也是一连串的字符,但是在Java中,与其它计算机语言将字符串作为字符数组来处理不同,Java将字符串作为String类型对象来处理。
将字符串作为内置的对象处理允许Java提供十分丰富的功能特性以方便处理字符串。如比较两个字符串,搜索子串,连接字符串以及改变字符串中的字母的大小写。而且String类型提供多种的构造方法,我们可以根据不同的需要来得到字符串对象。
一个特殊的现象,当创建一个String对象的时候,被创建的字符串是不能改变的,也就是说一个String类型的对象一旦被创建,将无法改变那些组成字符串的字符。为什么这么做呢?表面上看起来是一个严格的约束,但在事实上,正是因为如些,我们能执行一系列对字符串的操作。每次改变字符串的时候都要创建一个新的字符串类型来保存新的内容,原始的字符串并没有变化。这样做的目的就是因为固定的,不可变的字符串比实现可变的字符串更高效。StringBuffer类被称为一个String的友类,它的对象包含了在创建之后可以改变的字符串。
对于这两个类StringBuffer和String都定义在java.lang包中,不必显示的引入,而且两个类均被定义为final的,它们是没有子类的。
包含在类型String对象中的字符串的不可变意味着String实例一旦被建立,它的内容将不能被改变,但是在任何的时候,被说明为String引用的变量可以改变以指向另外一些字符串对象。
1、String的构造函数
默认的构造函数是没有参数的 如String s = new String();
构建一个被字符数组初始化的字符串:String(char chars[]) 如:char chars[] =
{'a','b','c'}; String s = new String(chars);
结果是得到了一个以abc初始化的字符串对象。
指定一个字符数组的一个子区域作为字符串的初始化值:
String(carh chars[],int startIndex,int numChars)
如:char chars[] = {'a','b','c','d','e','f'};
String s = new String(chars,2,3);
得到一上以cde初始化的字符串。
String (String strObj)的构造方法:
class MakeString{
public static void main(String[] args){
char c[] = {'j','a','v','a'};
String s1 = new String(c);
String s2 = new String(s1);
System.out.println(s1);
System.out.println(s2);
}
}
结果是s1 s2包含了相同的字符串。 还可以以一个字节数组为参数来构造一个String对象
String(byte asciiChars[])
String(byte asciiChars[],int startIndex,int numChars)
例;SubStringCons.java
2、字符串的长度
int length();
3、特殊的字符串操作
1)字符串文字
用new的方法来创建一个String类型的对象,是早期的做法,对于程序中的每一个字符串常量来说,Java会自动创建String对象,用字符串常量初始化一个String对象
String s = "abc";
字符串文字与一个String对象被对应起来,凡是能用到abc的地方都可以用String的对象:System.out.println("abc".lenght());
2)字符串的连接
Java中不允许对于一个字符串的对象进行操作,但有一种情况除外,就是+运算符。用+运算符可以连接两个字符串。
例: SubStringCons.java
3)字符串与其它数据类型的连接
int age1 = 24;
String s3 = "zhouyi is "+age1+" old";
System.out.println(s3);
age1是int型的,而不是String型的,但是程序的输出却相同。因为在String对象中的age的整型值自动转换成了String的形式,然后它作为String的一部分进行连接,+运算符能拼接的只有String的多个实例,所以编译器就将其中的一个运算数转化为了String的形式。
String s4 = "four: "+2+2;
System.out.println(s4);
与
String s5 = "four: "+(2+2);
System.out.println(s5);
的输也结果是不同的。
4)字符串转换和toString()
当Java在连接时将数据转换为其字符串的形式的时候,它是通过调用一个由字符串定义的字符串转换方法valueOf()来完成的。这个方法对所有的简单类型和类型Object重载。对于简单类型,方法返回一个字符串,这个字符串包含了相应其被调用的值的可读值。对于对象,这个方法调用了toString()方法,通过这个方法,可以确定所创建类的对象的字符串的形式。
每一个类都可以执行toString()方法,它是由Object定义的。多数情况下,toString()的方法的默认的实现是不够的,对于所创建的大多数的类,我们的做法是重载这个方法。
String toString()
它仅仅返回三个String对象,这个对象包含描述类中对象的可读的字符串。
例:toStringDemo.java
4、字符串的截取
String类提供了多种从String中截取字符的方法。尽管在String对象中构成字符串的字符不能像字符数组一样的被索引,许多字符串方法利用下标(偏移)对字符串进行操作,和数组
一样,字符串的下标从0开始。
1)charAt()方法
为了从一个字符串中取到一个字符,可以通过charAt()的方法直接引用单个了符
char charAt(int pos);
pos是想要得到的字符的下标。它的值必须是非负的,它指定了字符中串中的位置。charAt()方法返回指定的字符。
char c;
c = "abc".charAt(1);
例:testCharAt.java
2)getChars()方法
对于想一次想截取多个字符的话,可以用getChars()方法。
void getChars(int start,int end,char target[],int targetStart)
start指定了子串的开始下标,end指定了子串结束的下一个字符下标。所以,子串中应该包括的是从start到end-1之间的字符。
获得字符的数组由target[]指定。下标由targetStart指定,必须确保target[]的容量足够大。
例:TestGetChars.java
3)getBytes()
它是实现将字符放于字节数组中的getChars()方法的替代,它使用平台提供的默认的字符到字节的转换
byte[] getbytes[]
它还有其它的形式,具体见API
它存在的意义在于,当将字符串输出到一个不支持16位的编码环境的时候,它是很有用的。
大多数的Internet协议和文本文件格式在文本交换时使用8位的ASCII码。
4)toCharArray()
如果想将字符串转换成一个字符数组,可以用这个方法。
char[] toCharArray()
getChars()方法也能得到相同的结果。
5、字符串的比较
1)equals()和equalsIgnoreCase()
equals方法用来比较两个字符串是否相等
boolean equals(Object str)
如果两个字符串具有相同的长度和字符,返回true,是一种区分大小写的比较。
有一些情况要求我们对忽略大小写的两个字符串进行比较。
boolean equalsIgnoreCase(String str)
例:TestEquals.java
2)regionMatches()方法
它将一个字符串中指定的区间和另一个字符串中指定区间进行比较。并且允许比较的时候忽略大小写的。
它有两种形式:
boolean regionMatches(int startIndex,String str2,int str2StartIndex,int
numChars)
boolean regionMatches(boolean ignorecase,int startIndex,String
str2,int str2StartIndex,int numChars)
3)startWith()和endsWith()
startWith()判断一个给定的字符串是否从一个指定的字符串开始。相反的,endsWith()方法判断所讨论的字符串是否是以一个指定的字符串结尾。
它们的表达形式如下:
boolean startsWith(String str)
boolean endsWith(String str)
str是被测的字符串,如果字符串匹配,就返回true
"Foobar".endsWith("bar")和"Foobar".startsWith("Foo")都是返回true
startWith()还有下面的形式:
boolean startsWith(String str,int startIndex)
指定了调用字符串开始搜索的下标
“Foobar”.startsWith("bar",3);的返回结果为true
4)equals()与“==”的比较
对于二者的理解是重要的,equals方法比较的是字符串对象中的字符,而==运算符比较的是两个对象的引用看它们是否引用相同的实例。
例:TestEquals2.java
5)compareTo()方法
仅仅知道这两个字会串是不是相等是不够的,往往要求对于字符串进行排序,如字典。
int compareTo(String str)
比较的结果返回一个整型的值。大于0,调用字符串小于str;小于0,调用字符串大于str;等于0,则两个字符串相等。
例:SortString.java
在比较两个串的时候可以忽略大小写,compareToIgnoreCase()方法
int compareToIgnoreCase(String str),返回值的规则与compareTo()方法相同
6、字符串的搜索
indexOf()搜索字符或子字符串的首次出现
lastIndexOf()搜索字符或子字符串的最后一次出现
两种方法都被多种不同的方法重载,但是在所有的情况下,方法返回字符或子字符串被发现的位置的下标,当搜索失败的时候,返回-1
搜索字符首次出现用这样的形式
int indexOf(int ch)
搜索字符最后一次出现用这样的形式
int lastIndexOf(int ch) ch是被查找的字符
搜索字符串首次出现或最后一次出现用这样的形式
int indexOf(String str)
int lastIndexOf(String str)
如果需要指定搜索的起始点的话,可以用这样的形式:
int indexOf(int ch,int startIndex)
int lastIndexOf(int ch,int startIndex)
int indexOf(String str,int startIndex)
int lastIndexOf(String str,int startIndex)其中startIndex指定了搜索开始点的下标
对于indexOf()方法,搜索是从startIndex()开始到字符串的结束,对于lastIndexOf()方法,搜索是从startIndex开始到下标为0
例:IndexDemo.java
7、字符串的修改
1)substring()方法
用这个方法可以取到一个字符串的子串,有两种形式
String substring(int startIndex)
这里的startIndex指定了字符串开始的下标,其返回值是从startIndex开始到调用字符串结束的子串的拷贝
第二种形式:允许我们自己来指定开始和结束的下标
String substring(int startIndex,int endIndex)以参数指定起始和结束位置
例:StringReplace.java
2)concat()方法
String concat(String str);
这个方法会创建一个新的对象,这个对象包含调用字符串,str的内容跟在调用字符串的后面,与+运算符有相同的效果。
String s1 = "one";
String s2 = s1.concat("two");
等同于:
String s1 = "one";
String s2 = s1+"two";
3)replace()方法
replace()方法用另一个字符代替字符串中的一个字符的所有具体位置
String replace(char ch,char replacement)
其中ch是指定由replacement指定的字符所代替的字符,返回得到字符串
String s = "Hello".replace('1','w');
s的结果为Hewwo。
4)trim()方法
这个方法返回一个调用字符串的拷贝,字符串是将位于调用字符串前面和后面的空白符删除后的剩余部分
String trim()
如:String s = " Hello world ".trim();
s的值为Hello world
例:UseTrim.java
8、利用valueOf()方法实现数据转换
valueOf()方法将数据的内部格式转换为可读的形式,它是一种静态的方法
这种方法在String中被重载,为的是能使任何的方法都可以转换为String类型
valueOf()还被Object重载,所以创建的任何形式的对象也可被用作一个参数
static String valueOf(double num)
static String valueOf(long num)
static String valueOf(Object ob)
static String valueOf(char chars[])
事实上,用toString()方法也可以得到同样的结果
对于大多数的数组,valueOf()方法返回一个相当晦涩的字符串,这说明它是一个某种类型的数组
然而对于字符数组,它创建了一个包含了字条符数组中的字符的字符串对象。
valueOf()方法有一种特定的形式允许指定字符数组的一个子集
static String valueOf(char chars[],int startIndex,int numChars)
chars是存放字符的数组,startIndex是字符数组中期望得到的子字符串的首字符下标,numChars指定子字符串的长度
9、改变字符串内字符的大小写
toLowerCase()方法将字符串的所有字符从大写字母改写为小写字母。而toUpperCase方法将字符串的内容所有的字符从小写字母改为大写。
String toLowerCase()
String toUpperCase()
例:ChangeCase.java
10、StringBuffer
StringBuffer是提供了大量的字符串功能的字符串类的对等类。String类型的定长的,不可变的字符序列。
StringBuffer可有插入其中或追加其后的字符串或子串。它可以针对这些添加自动的增加空间,同时它还有比实际需要更多的预留字符,从而实现空间的增加。
多数程序员的做法是:仅仅处理String类型,而通过重载+运算符让JAVA在后台处理StringBuffer.
1)构造函数
StringBuffer有以下三个构造函数
StringBuffer()
StringBuffer(int size)
StringBuffer(String str)
默认的构造函数是无参的,它预留了16个字符的空间。它不需要再分配空间了。
第二种形式是一个参数的,用于设置缓冲区的大小。
第三种形式接收一个字符串参数,设置StringBuffer对象的初始内容,同时不进行再分配的多留也个16个字符的空间。
如果没有指定缓冲区的大小,StringBuffer分配了16个额外的字符空间,再次分配对资源的浪费是严重的,而且多次的分配会产生内存的碎片,影响性能。
这个类就是通过这样的方法,用一些额外的字符分配,减少再分配的发生次数。
2)length()和capacity()方法
以lenthg()方法可以得到当前的StringBuffer的长度。而通过调用capacity()方法可以得到总的分配容量。
int length()
int capacity()
例:StringBufferDemo.java,可以看出它对字符串的空间预留是16个字符
3)ensureCapacity()
如果想在构造StringBuffer之后为某些字符预分配空间,可以使用ensureCapacity()方法来设置缓冲区的大小
void ensureCapacity(int capacity) capacity为缓冲区的大小
4)setLength()
使用这个方法在StringBuffer对象内设置缓冲区的大小
void setLength(int len) len指定了缓冲区的长度,它是非负的。
当增加缓冲区的大小的时候,空字符被加在现存缓冲区的后面。
如果用一个小于length()方法返回的当前值的值调用setLength()方法,在获得新的长度之后,存储的字符会丢失,可以用这种方法来缩短StringBuffer
5)charAt()和setCharAt()
使用charAt()方法可以从StringBuffer中得到单个字符的值。可以用setCharAt()方法给StringBuffer中的字符设置值。
char charAt(int pos)
void setCharAt(int pos,char ch)
对于charAt()方法,pos指定获得的字符的下标。对于setCharAt()方法,where指定被置值的字符的下标,以ch指定新值。
pos必须是非负的,也不能指向缓冲区之外的位置。
例:setCharAtDemo.java
6)getChars()
这个方法可以将StringBuffer的子字符串复制给数组。其形式如下:
void getChars(int sourceStart,int sourceEnd,char target[],int
targetStart);
sourceStart指定的是字符串开始时的下标,而sourceEnd指定了这个字符串结束的时候下一个字符的下标。
这意味着字符串包含了从sourceStart到sourceEnd-1位置上的字符。
接收字符的数组由target指定
在target内将被复制子字符串的位置下标由targetStart传递。
要注意的就是target的大小应该足够大。
7)append()
append()方法将任何一其他类型数据的字符串形式连接到调用StringBuffer对象的后面。
对于所有的内置类型和Object类型都有重载形式。
StringBuffer append(String str)
StringBuffer append(int num)
Stringbuffer append(Object obj)
每一个参数调用String.valueOf()方法获得其字符串表达的形式。结果追加在当前的StringBuffer对象的后面
对于每一种append形式,返回缓冲区本身。它允许后续的调用被连成一串。
例:TestAppend.java
当对字符串对象使用+运算符的时候,append()方法是最常被调用的。JAVA自动的改变对字符串实例的修改。
因此,连接调用StringBuffer对象的append()方法。在执行连接后,编译器插入对toString()方法的调用,并将修改的StringBuffer返回到一个不变的字符串中。
过程很复杂,但是为什么要用StringBuffer字符串类呢?
原因就是性能。
Java运行时执行的许多优化是知道字符串对象是不可以改变的,但是JAVA隐藏了很多String与StringBuffer之间的转换。只是程序员没有感觉到而已。
8)insert()
这个方法将一个字符插入另一个字符串中去。它被重载而接受所有的简单类型的值,包括String Object.
和append()方法一样,它调用String.valueOf()方法得到调用它的值的字符串表达式。随后这个字符符串被插入所调用的StringBuffer对象中。
它有如下的几种形式:
StringBuffer insert(int index,String str)
StringBuffer insert(int index,Char ch)
StringBuffer insert(int index,Object obj)
其中index 指的是将字符串插入所调用的StringBuffer对象中的插入点的下标。
例:TestInsert.java
9)reverse()
这个方法可以将StringBuffer对象内的字符串翻转。
StringBuffer reverse()
返回的是一个被调用对象的翻转对象。
例:TestReverse.java
10)delete()和deleteCharAt()方法
这是在JAVA2中增加的方法,用到删除字符串。
StringBuffer delete(int startIndex,int endIndex)
StinrgBuffer deleteCharAt(int loc)
delete()方法从调用对象中删除一串字符。startIndex指定要删除的第一个字符的下标,而endIndex指定了需删除的最后一个字符的下一个字符的下标
所以要删除的子串从startIndex到endIndex-1,返回StringBuffer对象。
deleteCharAt()方法删除loc指定的下标的字符,把结果返回给StringBuffer对象
例:TestDelete.java
11)replace()
java2中增加的方法,它的作用是完成在StringBuffer内部用一组字符代替另一组字符的功能。
StringBuffer replace(int startIndex,int endIndex,String str)
被替换的子字符串由下标startIndex和endIndex指定。所以是startIndex到endIndex-1位置的字符被替换。
str指定替代的参数。并将结果返回给StringBuffer对象。
例:TestReplace.java
12)substring()
java2中增加的方法。返回StringBuffer的一部分值。
String substring(int startIndex)
String substring(int startIndex,int endIndex)
第一种形式返回调用StringBuffer对象中的从startIndex开始一直到结束的一个子字符串。
第二种形式返回从startIndex开始到endIndex-1结束的子字符串。
希望这篇对字符串处理的总结对您的学习和工作有帮助!
|