第六章、Java字符串处理
第一节、String对象
一、
Java中将字符串作为String类型对象来处理。当创建一个String对象时,被创建的字符串是不能被改变的。每次需要改变字符串时都要创建一个新的String对象来保存新的内容。原始的字符串不变。之所以采用这种方法是因为实现固定的,不可变的字符串比实现可变的字符串更高效。对于那些想得到改变的字符串的情况,有一个叫做StringBuffer的String类的友类,它的对象包含了在创建之后可以改变的字符串。
String类和StringBuffer类都在java.lang中定义。因此它们可以自动的被所有程序使用。两者均被说明为final,这意味着两者均不含子类。
二、String构造函数
(1)String(), 默认构造函数,无参数
String s1 = new String();
(2)String( char chars[]) ,传入字符数组
char[] myChars={'a', 'b', 'c'};
String s2 = new String(myChars) // 使用字符串“abc”初始化s2
(3)String( char chars[], int startIndex, int numChars) ,传入一个字符数组,从指定下标位置开始获取指定个数的字符,用这些字符来初始化字符串变量。
char[] myChars={'h', 'e', 'l', 'l', 'o'};
String s3 = new String(myChars,1,3); //使用字符串“ell”初始化s3
(4)String(String strObj),传入另一个字符串对象,用该字符串对象的内容初始化
String s4= new String(s3); // 这是s4也是“ell”了。
(5)String(byte asciiChars[])
String(byte asciiChars[], int startIndex, int numChars)
尽管Java的char类型使用16位(bit)表示Unicode编码字符集,在Internet中,
字符串的典型格式使用由ASCII字符集构成的8位数组,因为8位ASCII字符串是共同的,当给定一个字节(byte)数组时,String类提供了上面两个初始化字符串的构造函数。
例子:
package Examples;
class SubStringConv{
public static void main(String[] args){
byte ascii[]={65,66,67,68,69,70};
String s1=new String(ascii);
System.out.println(s1);
String s2=new String(ascii,2,3);
System.out.println(s2);
}
}
编译和运行后输出:
ABCDEF
CDE
三、
(1)调用字符串的length()方法可以得到该字符串的长度(字符个数);
(2)前面说明了如何使用new运算符创建一个字符串实例。然而这是一种早期的使用字符串常量的处理方法。对于程序中的每一个字符串常量,Java会自动创建String对象。因此,可以使用字符串常量初始化String对象。例如:
String s5="abc";
int i = "abc".length(); //可以将字符串作为对象来进行操作
(3)可以使用“+”运算符来将两个字符串连接起来产生一个新的String对象。只要+运算符有一个运算数是字符串(String)实例时,编译器就将另一个运算数转换为它的字符串形式。这种操作是通过调用一个由String类定义的 字符串转换方法valueOf()来完成的。对于简单类型,valueOf()方法返回一个字符串,该字符串包含了该类型的值的字符串。对于对象,valueOf()方法调用toString()方法。每一个类都执行toString()方法,因为它是由Object定义的。toString()方法具有如下一般形式: String toString() 。 toString()方法返回一个String对象(即字符串)。该对象一般是对类的一个描述。
四、一些字符串操作
(1)字符截取
*char charAt(int where) ,注意,这里返回一个char字符例如:
char a ;
a="abcde".charAt(2); //将索引为2 ,即第三个字符赋给a
* void getChars(int sourceStart, int sourceEnd, char target[], int targetStart) ,这里是无返回值方法,指定要截取的子字符串的开始和结束下标,再指定要储存子字符串内字符的数组,和存放这些字符的起始位置。注意,子字符串并不包括位于结束下标的字符。
* byte[] getBytes() 这是getBytes()方法最简单的形式,它实现将字符存放于字节数组中。在将字符串(String)值输出到一个不支持16位Unicode编码的环境时,getBytes
()是最有用的。例如,大多数Internet协议和文本文件格式在文本交换时使用8位ASCII编码。
* char[] toCharArray() 将字符串中所有的字符转换到一个字符数组的最简当方法,也可以使用getChars()方法实现。
(2)字符串比较
* boolean equals(Object str) 比较两个字符串对象是否相等,
boolean equalsIgnoreCaseJ(String str) 比较两个字符串对象,且忽略字符的大小写
* regionMatches() 方法允许将一个字符串中指定的区间和另一字符串中指定的区间进行比较,它的重载形式允许在比较时忽略大小写。下面给出这两种方法的一般形式:
boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)
boolean regionMatches(boolean ignoreCase ,int startIndex,String str2,int str2StartIndex,int numChars)
其中startIndex指定调用此方法的字符串内子字符串的起始位置。
* boolean startsWith(String str) startsWith方法还有第二种形式:
boolean startWith(String str, int startIndex)
boolean endsWith(String str)
上面的方法用来判断一个给定的字符串是否是从指定的字符串开始或结束。
* int compareTo(String str) 方法用于比较两个字符串的大小。字符串比较的结果及其含义:
值 | 含义 |
小于0 | 调用此方法的字符串小于参数str |
大于0 | 调用此方法的字符串大于参数str |
等于0 | 两个字符串相等 |
(3)其他操作
* 搜索字符串:
int indexOf( int ch)
int lastIndexOf( int 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)
* 使用 substring()截取子字符串:
String substring(int startIndex) 注意substring中string没有大写,截取指定位置后的子字符串。
String substring(int startIndex,int endIndex) 截取指定起始位置和结束位置的子字符串。注意截取的字字符串不包括结束位置的字符。
* concat() 连接连个字符串,与+ 运算符执行相同功能。
String concat(String str)
* replace() 用另一个字符取代指定字符串中指定字符:
String replace(char original, char replacement) 例如:
String s=”Hello”.replace(‘l’,’w’); //执行后 s =”Hewwo”;
* trim() 返回一个字符串,该字符串是删除调用字符串前后的空白符所得的字符串
* 改变字符串内字符的大小写
String toLowerCase() 返回一个所有字母都是小写的字符串
String toUpperCase()返回一个所有字母都是大写的字符串
* 使用 valueOf()方法实现数据转换
例如:
String str = String.valueOf(3) ; //将int类型转换成字符串类型,其他基本数据类型和任何类的对象也可作为参数。
第二节、StringBuffer
StringBuffer定义了下面三个构造函数:
StringBuffer() // 默认构造函数,预留了16个字符的空间,该空间不需再分配
StringBuffer(int size) // 设置指定缓冲区大小
StringBuffer(String str) // 设置StringBuffer对象初始化的内容并预留16个字符空间,且不需再分配空间
* int length()
调用length()方法可以得到StringBuffer对象的长度,调用capacity()可以得到总的分配容量。两个方法都是返回一个int类型的值。
* void ensureCapacity(int capacity)
如果想在构造StringBuffer对象后为某些字符预分配空间,可以使用ensureCapacity()方法,设置缓冲区的大小,这在事先已知要在StringBuffer上追加大量小字符串的情况下是有用的。ensureCapcity()方法具有如下的一般形式: void ensureCapacity(int capacity)
* void setLength(int len)
使用setLength()方法可以设置StringBuffer对象的长度,它的一般形式如下:
void setLength(int len) 如果len大于StringBuffer对象当前的length()值的话,那么会在StringBuffer对象后面加上空字符;如果比length()小的话,则len后面的字符串会丢失。
* char charAt(int where)
void setCharAt(int where, char ch)
使用charAt()方法可以得到StringBuffer对象中指定位置上的字符,setCharAt() 可以设置指定位置上的字符。它们的一般形式如下:
char charAt(int where)
void setCharAt(int where,char ch)
对于这两种法法,where值必须是非负的,同时不能超过或等于StringBuffer对象的长度。
* getChars(int suorceStart,int sourceEnd,char target[] , int targetStart)
* append()
Append()方法将任一其他类型数据的字符串形式连接到调用StringBuffer对象的后面,对所有内置的类型和Object,它都有重载形式。下面是几种形式:
StringBuffer append(String str)
StringBuffer append(int num)
StringBuffer append(Object obj)
* insert()
Insert()方法将一个字符串插入另一个字符串中。下面是它的几种形式:
StringBuffer insert(int index,String str)
StringBuffer insert(int index,char ch)
StringBuffer insert(int index,Object obj)
*reverse() // StringBuffer reverse()
StringBuffer strbf=new StringBuffer(“ABCDEFG”);
strbf.reverse();
System.out.println(strbf); //输出 GFEDCBA
* StringBuffer delete(int startIndex,int endIndex)
StringBuffer deleteCharAt(int loc)
删除指定位置的字符串和指定位置的字符。例如删除第一个字符后的所有字符:
strbf.delete(1,strbf.length());
* replace()
它完成在StringBuffer内部用一个字符串代替另一个指定起始位置和结束位置的字符串的功能,注意的是,被代替的字符不包括结束位置上的字符,它的一般形式是,:
StringBuffer replace(int startIndex, int endIndex,String str)
* substring() 返回StringBuffer的一部分值
String substring(int startIndex)
String substring(int startIndex, int endIndex)