第 4章 字符串
第 4章 字符串
4.1 String 类的特点
4.2 String Buffer类的特点
4.3 字符串的特殊处理方法
第 4章 字符串
4.1 String 类的特点
String类是字符串常量类, 该类对象在建立后不能
修改 。 Java编译器保证每个字符串常量都是 String类对
象 。 用双引号括住的一串字符即为字符串常量, 比如
,Welcome to Java!",在通过编译器编译后成为 String对
象 。 因而, 实例化一个 String类对象既可以通过字符串
常量, 也可以通过系统提供的构造方法 。
第 4章 字符串
4.1.1 String类的基本方法
前面谈到过 String类的一些基本属性, 本节我们讨
论 String类的一些常用方法 。
1,String类初始化
String类可用字符串常量对其初始化, 也可调用其
构造方法来进行 。 例如:
String s="Welcome to Java Wrold! ";
String类主要构造方法见表 4.1。
第 4章 字符串
表 4.1 String类的构造方法
方 法 功能描述
String() 生成一个空串
String(String value) 用已知串生成一个串对象
String(char value[]) 用字符数组生成一个串对象
String(char value[],int offset,int count) 用字符数组 value的 offset位置开始的 count个字符, 建立一个字符串对象, 之后并不影响
原来的字符数组
String(char value[],int hibyte,int offset,int
count) 基本功能同上
第 4章 字符串
例如:
char char1[]={ 'a','b','c','d'};
String s1=new String();
String s2=new String(char1);
String s3=new String(char1,1,2);
//生成字符串, bc”
String s4=new String(char1,0,1,3);
//生成字符串, bcd”
第 4章 字符串
2,字符串类的 String访问
字符串的访问即字符串的引用,它包括得到字符
串的长度,得到指定位置的字符或子串,以及得到某
个字符或子串在字符串中的索引位置等。 String类的功
能很强,几乎覆盖了所有的字符串运算操作。表 4.2给
出了一些常用的字符串运算方法。
第 4章 字符串
表 4.2 String类的常用方法列表
方 法 功能描述
length() 返回字符串的长度
toLowerCase() 转换为小写串
toUpperCase() 转换为大写串
charAt(int index) 返回字符串的第 index个字符
substring(int beginindex) 返回从 beginindex位置 (包括该位置 )开始到结尾的所有字符
substring(int beginindex,int endindex) 返回从 beginindex位置 ( 包括 ) 开始到endindex(不包括 )的所有字符
compareTo(String anotherString) 字符串比较, 返回值为二者差
第 4章 字符串
regionMatches(int toffset,String other,int
ooffset,int len)
比较本串从 toffset开始的 len个字符和
other串从 ooffset开始的 len个字符是否
一致
startWith(String prefix) 比较字符串是否以 prefix开始
endWith(String suffix) 比较字符串是否以 suffix结束
indexOf(int ch) 返回某个字符或字符串在本字符串中第一次出现的位置
lastIndexOf() 返回某个字符或字符串在本字符串中最后一次出现的位置
replace(char oldChar,char newChar) 将 字 符 串 中 oldChar 字 符 替 换 成newChar字符
valueOf(Object obj) 将某个对象的实例转换成字符串
第 4章 字符串
例如:
String s="abCD";
int i=s.length(); // i=4
String s1=s.toLowerCase(); //s1="abcd"
String s2=s.toUpperCase(); //s2="ABCD"
char c=s.charAt(3); // c='D'
String s3=s.substirng(2); //s3="CD"
String s4=s.substirng(2,3); //s4="C"
第 4章 字符串
boolean b=s.regionMatches(1,"bCE",0,2); //b=false
boolean b1=s.startWith("ab"); //b1=true
boolean b2=s.endWith("de"); //b2=false
int m=s.indexOf('C'); // m=2
int k=s.lastIndexOf('C'); //k=2
String s5=s.replace('b','B'); // s5="aBCD"
double d=5.234;
String s6=String.valueOf(d); //s6="5.234"
第 4章 字符串
4.1.2 String类的使用实例
在上一节中我们给出了 String类的一些方法, 可以
看出, String类几乎覆盖了字符串的所有操作, 给实际
的编程带来了极大的方便 。 下面我们给出一个 String类
的使用实例 。
例 4.1
import java.awt.*;
public class Messages {
第 4章 字符串
/*
Allows messages to be sent to the class SquareFigure via a
dialog box.
*/
public static void main (String [ ] args) {
SquareFigure.create();
while (true) {
try {
第 4章 字符串
String message1 = DialogBox.request
("Supply message to be sent,",
"SquareFigure.");
String message = message1.trim();
int startArg = message.indexOf('(');
int endArg = message.indexOf(')');
int commaPosn;
String argRaw;
String arg;
String arg1Raw;
String arg1;
String arg2Raw;
第 4章 字符串
String arg2;
String name1 = message.substring(0,startArg);
//取出类中的方法
String name = name1.trim();
if (endArg - startArg > 1) {
argRaw = message.substring(startArg+1,endArg);
//得到方法的调用参数
arg = argRaw.trim();
}
else arg = "";
if (endArg != message.length() - 1)
第 4章 字符串
DialogBox.warn("Message not understood,try again!");
elseif (name.equals("SquareFigure.moveRight"))
SquareFigure.moveRight(Integer.parseInt(arg));
else if (name.equals("SquareFigure.moveLeft"))
SquareFigure.moveLeft(Integer.parseInt(arg));
elseif(name.equals("SquareFigure.moveUp"))
SquareFigure.moveUp(Integer.parseInt(arg));
elseif(name.equals("SquareFigure.moveDown"))
第 4章 字符串
SquareFigure.moveDown(Integer.parseInt(arg));
elseif
(name.equals("SquareFigure.setColour")){if
(arg.equals("Color.red"))
SquareFigure.setColour(Color.red);
else if (arg.equals("Color.blue"))
SquareFigure.setColour(Color.blue);
else if (arg.equals("Color.green"))
SquareFigure.setColour(Color.green);
else DialogBox.warn("Invalid colour,try again");
第 4章 字符串
}
else DialogBox.warn("Message not
understood,try again!");
} catch (Exception e) {
DialogBox.warn("Message not understood,try
again!");
}
}
}
}
第 4章 字符串
在该例中, SquareFigure,DialogBox同样是我们提
供的标准类, 读者可从附录中查阅 。
本程序首先生成一个红色的正方形 (如图 4.1所示 ),
该正方形显示在窗口的正中间, 同时会出现一个如图
4.2所示的提示框 。 在该提示框中输入类 SquareFigure中
的方法, 就可以达到移动, 改变颜色的目的 。 如在提
示框中分别输入 moveUp(30),setColour(Color.blue)后
结果如图 4.3,4.4所示 。 在程序中, 我们用到了 String
类的一些方法, 读者可自行分析 。
第 4章 字符串
图 4.1
第 4章 字符串
图 4.2
第 4章 字符串
图 4.3
第 4章 字符串
图 4.4
第 4章 字符串
4.2 String Buffer类的特点
String类是字符串常量类, 初始化后就不能进行修
改, 而 String Buffer类是字符串缓冲区, 不仅可以接受
修改, 还可以读入整个文件 。 在 Java中, String Buffer
类是一个可以修改的字符串对象, 使用起来比 String类
更加灵活, 方便 。 Java中并不支持运算符的重载, 但
,+”是个例外, 例如, 对语句:
String s="Welcome "+"to"+"Java! ";
第 4章 字符串
编译器首先生成类 StringBuffer的一个实例, 然后
连续调用方法 append(),最后, 再调用方法 toString()把
StringBuffer对象转换为 String对象 。 这相当于执行语句:
String
s=new
String Buffer("Welcome").append("to").append("Java!
").toString();
第 4章 字符串
4.2.1 String Buffer类的基本方法
与 String类类似, String Buffer类方法很多, 下面我
们也从初始化与访问方法两个方面加以介绍 。
1,String Buffer类的初始化
String Buffer类只能用初始化函数对其初始化, 如
果想按下面语句:
String Buffer s= "Welcome to Java! ";
对其初始化, 则系统会给出出错信息 。
String Buffer的构造函数如表 4.3所示 。
第 4章 字符串
表 4.3 String Buffer类的构造函数
函 数 功能描述
StringBuffer() 建立空的字符串对象
StringBuffer(int length) 建立长度为 length的字符串对象
StringBuffer(String) 建立一个初始值为 String的字符串对象
第 4章 字符串
2,String Buffer类的访问方法
String Buffer类的方法主要就是添加字符和插入字
符, 如表 4.4所示 。
第 4章 字符串
表 4.4 String Buffer类的主要方法
方 法 功能描述
length() 返回字符串长度
setLength(int newlength) 重新设置字符串的长度, 新串为旧串的截余
charAt(int index) 返回指定位置的字符
setCharAt(int index,char ch) 重设指定位置的字符
append(Object obj) 将指定对象转换为字符串添加到原串尾
insert(int offset,Object obj) 将指定对象转换为字符串, 然后插入到从 offset开始的位
置
toString() 将字符串转换成 String对象
第 4章 字符串
例如:
string Buffer sb=new String Buffer("this is a test String
Buffer");
sb.setLength(14); // sb="this a test"
sb.set Char(0,' T '); //sb="This is a test"
sb.append(5.12); // append a double number
sb.append(true); //append a Boolean number,
then sb="This is a test5.12true"
sb.insert(14,"value="); //sb="This is a test
value=5.12true"
第 4章 字符串
4.2.2 String Buffer类的使用实例
下面给出一个字符串的反转操作实例 。
例 4.2
public class Reverse String {
public Reverse String() {
}
public static void main(String args[]){
String message1 = Dialog Box.request
第 4章 字符串
("Supply a String to be reversed,");
ReverseString r=new ReverseString();
Transcript.print(r.reverse(message1));
}
public String reverse(String s){
int len=s.length();
StringBuffer sb=new StringBuffer();
第 4章 字符串
for(int i=(len-1);i>=0; i--) {
sb.append(s.charAt(i));
}
return sb.toString();
}
}
当运行程序的时候, 会出现一个对话框, 要求输入
一个字符串 。 如输入:, Welcome to Java World!"(如图
4.5所示 ),则反转的结果如图 4.6所示 。
第 4章 字符串
图 4.5
第 4章 字符串
图 4.6
第 4章 字符串
4.3 字符串的特殊处理方法
我们知道, 基于网络的应用常常会碰到诸如对一
个字符串进行解析, 将其分解为多个子串的问题 。 如
Web页面表格设计中, 浏览器可能以字符串的形式返
回多个表格值 。 例如:
String s="name=Boy&sex=male&age=20";
第 4章 字符串
如果调用 String,String Buffer类中方法, 当然也可
以实现字符串的解析, 但较为繁琐 。 为此, Java类
java.util提供了 String Tokenizer对字符串进行解析, 我
们将给出两个实现同一目的的例子加以说明 。
例 4.3
import java.util.*;
public class String Parse {
public String Parse() {
第 4章 字符串
}
public static void main(String args[]){
String s="name=Boy&sex=male&age=20";
StringTokenizer st=new StringTokenizer(s,"&= ");
while(st.hasMoreTokens()) {
Transcript.print(st.nextToken());
Transcript.println("="+st.nextToken());
}
}
}
第 4章 字符串
在该程序中, 对 String Tokenizer对象进行初始化的
同时, 我们还对它进行了分隔符的设置 (本例中, 我们
设置为字符, &”与, =”)。 方法 has More Tokens()用于
判断解析是否完毕; next Token()得到下一个记号 。 本
例的运行结果如图 4.7所示 。
下面是一个用 String,String Buffer的类方法实现字
符串解析的例子 。
图 4.7
第 4章 字符串
例 4.4
public class StringParse1 {
public StringParse1() {
}
public static void main(String args[]){
String parsestr[]=new String[3];
String parsename[]=new String[3];
String parsevalue[]=new String[3];
第 4章 字符串
String s="name=Boy&sex=male&age=20";
int i,j,k,count;
i=j=k=0;
while((j=s.indexOf('&',i))!=-1)
{
parsestr[k++]=s.substring(i,j);
i=j+1;
}
parsestr[k]=s.substring(i);
count=k+1;
for(i=0;i<count;i++)
{
第 4章 字符串
j=parsestr[i].indexOf('=');
parsename[i]=parsestr[i].substring(0,j);
j++;
parsevalue[i]=parsestr[i].substring(j);
}
for(i=0;i<count;i++)
Transcript.println(parsename[i]+"="+parsevalue[i]);
}
}
第 4章 字符串
图 4.8
第 4章 字符串
4.1 String 类的特点
4.2 String Buffer类的特点
4.3 字符串的特殊处理方法
第 4章 字符串
4.1 String 类的特点
String类是字符串常量类, 该类对象在建立后不能
修改 。 Java编译器保证每个字符串常量都是 String类对
象 。 用双引号括住的一串字符即为字符串常量, 比如
,Welcome to Java!",在通过编译器编译后成为 String对
象 。 因而, 实例化一个 String类对象既可以通过字符串
常量, 也可以通过系统提供的构造方法 。
第 4章 字符串
4.1.1 String类的基本方法
前面谈到过 String类的一些基本属性, 本节我们讨
论 String类的一些常用方法 。
1,String类初始化
String类可用字符串常量对其初始化, 也可调用其
构造方法来进行 。 例如:
String s="Welcome to Java Wrold! ";
String类主要构造方法见表 4.1。
第 4章 字符串
表 4.1 String类的构造方法
方 法 功能描述
String() 生成一个空串
String(String value) 用已知串生成一个串对象
String(char value[]) 用字符数组生成一个串对象
String(char value[],int offset,int count) 用字符数组 value的 offset位置开始的 count个字符, 建立一个字符串对象, 之后并不影响
原来的字符数组
String(char value[],int hibyte,int offset,int
count) 基本功能同上
第 4章 字符串
例如:
char char1[]={ 'a','b','c','d'};
String s1=new String();
String s2=new String(char1);
String s3=new String(char1,1,2);
//生成字符串, bc”
String s4=new String(char1,0,1,3);
//生成字符串, bcd”
第 4章 字符串
2,字符串类的 String访问
字符串的访问即字符串的引用,它包括得到字符
串的长度,得到指定位置的字符或子串,以及得到某
个字符或子串在字符串中的索引位置等。 String类的功
能很强,几乎覆盖了所有的字符串运算操作。表 4.2给
出了一些常用的字符串运算方法。
第 4章 字符串
表 4.2 String类的常用方法列表
方 法 功能描述
length() 返回字符串的长度
toLowerCase() 转换为小写串
toUpperCase() 转换为大写串
charAt(int index) 返回字符串的第 index个字符
substring(int beginindex) 返回从 beginindex位置 (包括该位置 )开始到结尾的所有字符
substring(int beginindex,int endindex) 返回从 beginindex位置 ( 包括 ) 开始到endindex(不包括 )的所有字符
compareTo(String anotherString) 字符串比较, 返回值为二者差
第 4章 字符串
regionMatches(int toffset,String other,int
ooffset,int len)
比较本串从 toffset开始的 len个字符和
other串从 ooffset开始的 len个字符是否
一致
startWith(String prefix) 比较字符串是否以 prefix开始
endWith(String suffix) 比较字符串是否以 suffix结束
indexOf(int ch) 返回某个字符或字符串在本字符串中第一次出现的位置
lastIndexOf() 返回某个字符或字符串在本字符串中最后一次出现的位置
replace(char oldChar,char newChar) 将 字 符 串 中 oldChar 字 符 替 换 成newChar字符
valueOf(Object obj) 将某个对象的实例转换成字符串
第 4章 字符串
例如:
String s="abCD";
int i=s.length(); // i=4
String s1=s.toLowerCase(); //s1="abcd"
String s2=s.toUpperCase(); //s2="ABCD"
char c=s.charAt(3); // c='D'
String s3=s.substirng(2); //s3="CD"
String s4=s.substirng(2,3); //s4="C"
第 4章 字符串
boolean b=s.regionMatches(1,"bCE",0,2); //b=false
boolean b1=s.startWith("ab"); //b1=true
boolean b2=s.endWith("de"); //b2=false
int m=s.indexOf('C'); // m=2
int k=s.lastIndexOf('C'); //k=2
String s5=s.replace('b','B'); // s5="aBCD"
double d=5.234;
String s6=String.valueOf(d); //s6="5.234"
第 4章 字符串
4.1.2 String类的使用实例
在上一节中我们给出了 String类的一些方法, 可以
看出, String类几乎覆盖了字符串的所有操作, 给实际
的编程带来了极大的方便 。 下面我们给出一个 String类
的使用实例 。
例 4.1
import java.awt.*;
public class Messages {
第 4章 字符串
/*
Allows messages to be sent to the class SquareFigure via a
dialog box.
*/
public static void main (String [ ] args) {
SquareFigure.create();
while (true) {
try {
第 4章 字符串
String message1 = DialogBox.request
("Supply message to be sent,",
"SquareFigure.");
String message = message1.trim();
int startArg = message.indexOf('(');
int endArg = message.indexOf(')');
int commaPosn;
String argRaw;
String arg;
String arg1Raw;
String arg1;
String arg2Raw;
第 4章 字符串
String arg2;
String name1 = message.substring(0,startArg);
//取出类中的方法
String name = name1.trim();
if (endArg - startArg > 1) {
argRaw = message.substring(startArg+1,endArg);
//得到方法的调用参数
arg = argRaw.trim();
}
else arg = "";
if (endArg != message.length() - 1)
第 4章 字符串
DialogBox.warn("Message not understood,try again!");
elseif (name.equals("SquareFigure.moveRight"))
SquareFigure.moveRight(Integer.parseInt(arg));
else if (name.equals("SquareFigure.moveLeft"))
SquareFigure.moveLeft(Integer.parseInt(arg));
elseif(name.equals("SquareFigure.moveUp"))
SquareFigure.moveUp(Integer.parseInt(arg));
elseif(name.equals("SquareFigure.moveDown"))
第 4章 字符串
SquareFigure.moveDown(Integer.parseInt(arg));
elseif
(name.equals("SquareFigure.setColour")){if
(arg.equals("Color.red"))
SquareFigure.setColour(Color.red);
else if (arg.equals("Color.blue"))
SquareFigure.setColour(Color.blue);
else if (arg.equals("Color.green"))
SquareFigure.setColour(Color.green);
else DialogBox.warn("Invalid colour,try again");
第 4章 字符串
}
else DialogBox.warn("Message not
understood,try again!");
} catch (Exception e) {
DialogBox.warn("Message not understood,try
again!");
}
}
}
}
第 4章 字符串
在该例中, SquareFigure,DialogBox同样是我们提
供的标准类, 读者可从附录中查阅 。
本程序首先生成一个红色的正方形 (如图 4.1所示 ),
该正方形显示在窗口的正中间, 同时会出现一个如图
4.2所示的提示框 。 在该提示框中输入类 SquareFigure中
的方法, 就可以达到移动, 改变颜色的目的 。 如在提
示框中分别输入 moveUp(30),setColour(Color.blue)后
结果如图 4.3,4.4所示 。 在程序中, 我们用到了 String
类的一些方法, 读者可自行分析 。
第 4章 字符串
图 4.1
第 4章 字符串
图 4.2
第 4章 字符串
图 4.3
第 4章 字符串
图 4.4
第 4章 字符串
4.2 String Buffer类的特点
String类是字符串常量类, 初始化后就不能进行修
改, 而 String Buffer类是字符串缓冲区, 不仅可以接受
修改, 还可以读入整个文件 。 在 Java中, String Buffer
类是一个可以修改的字符串对象, 使用起来比 String类
更加灵活, 方便 。 Java中并不支持运算符的重载, 但
,+”是个例外, 例如, 对语句:
String s="Welcome "+"to"+"Java! ";
第 4章 字符串
编译器首先生成类 StringBuffer的一个实例, 然后
连续调用方法 append(),最后, 再调用方法 toString()把
StringBuffer对象转换为 String对象 。 这相当于执行语句:
String
s=new
String Buffer("Welcome").append("to").append("Java!
").toString();
第 4章 字符串
4.2.1 String Buffer类的基本方法
与 String类类似, String Buffer类方法很多, 下面我
们也从初始化与访问方法两个方面加以介绍 。
1,String Buffer类的初始化
String Buffer类只能用初始化函数对其初始化, 如
果想按下面语句:
String Buffer s= "Welcome to Java! ";
对其初始化, 则系统会给出出错信息 。
String Buffer的构造函数如表 4.3所示 。
第 4章 字符串
表 4.3 String Buffer类的构造函数
函 数 功能描述
StringBuffer() 建立空的字符串对象
StringBuffer(int length) 建立长度为 length的字符串对象
StringBuffer(String) 建立一个初始值为 String的字符串对象
第 4章 字符串
2,String Buffer类的访问方法
String Buffer类的方法主要就是添加字符和插入字
符, 如表 4.4所示 。
第 4章 字符串
表 4.4 String Buffer类的主要方法
方 法 功能描述
length() 返回字符串长度
setLength(int newlength) 重新设置字符串的长度, 新串为旧串的截余
charAt(int index) 返回指定位置的字符
setCharAt(int index,char ch) 重设指定位置的字符
append(Object obj) 将指定对象转换为字符串添加到原串尾
insert(int offset,Object obj) 将指定对象转换为字符串, 然后插入到从 offset开始的位
置
toString() 将字符串转换成 String对象
第 4章 字符串
例如:
string Buffer sb=new String Buffer("this is a test String
Buffer");
sb.setLength(14); // sb="this a test"
sb.set Char(0,' T '); //sb="This is a test"
sb.append(5.12); // append a double number
sb.append(true); //append a Boolean number,
then sb="This is a test5.12true"
sb.insert(14,"value="); //sb="This is a test
value=5.12true"
第 4章 字符串
4.2.2 String Buffer类的使用实例
下面给出一个字符串的反转操作实例 。
例 4.2
public class Reverse String {
public Reverse String() {
}
public static void main(String args[]){
String message1 = Dialog Box.request
第 4章 字符串
("Supply a String to be reversed,");
ReverseString r=new ReverseString();
Transcript.print(r.reverse(message1));
}
public String reverse(String s){
int len=s.length();
StringBuffer sb=new StringBuffer();
第 4章 字符串
for(int i=(len-1);i>=0; i--) {
sb.append(s.charAt(i));
}
return sb.toString();
}
}
当运行程序的时候, 会出现一个对话框, 要求输入
一个字符串 。 如输入:, Welcome to Java World!"(如图
4.5所示 ),则反转的结果如图 4.6所示 。
第 4章 字符串
图 4.5
第 4章 字符串
图 4.6
第 4章 字符串
4.3 字符串的特殊处理方法
我们知道, 基于网络的应用常常会碰到诸如对一
个字符串进行解析, 将其分解为多个子串的问题 。 如
Web页面表格设计中, 浏览器可能以字符串的形式返
回多个表格值 。 例如:
String s="name=Boy&sex=male&age=20";
第 4章 字符串
如果调用 String,String Buffer类中方法, 当然也可
以实现字符串的解析, 但较为繁琐 。 为此, Java类
java.util提供了 String Tokenizer对字符串进行解析, 我
们将给出两个实现同一目的的例子加以说明 。
例 4.3
import java.util.*;
public class String Parse {
public String Parse() {
第 4章 字符串
}
public static void main(String args[]){
String s="name=Boy&sex=male&age=20";
StringTokenizer st=new StringTokenizer(s,"&= ");
while(st.hasMoreTokens()) {
Transcript.print(st.nextToken());
Transcript.println("="+st.nextToken());
}
}
}
第 4章 字符串
在该程序中, 对 String Tokenizer对象进行初始化的
同时, 我们还对它进行了分隔符的设置 (本例中, 我们
设置为字符, &”与, =”)。 方法 has More Tokens()用于
判断解析是否完毕; next Token()得到下一个记号 。 本
例的运行结果如图 4.7所示 。
下面是一个用 String,String Buffer的类方法实现字
符串解析的例子 。
图 4.7
第 4章 字符串
例 4.4
public class StringParse1 {
public StringParse1() {
}
public static void main(String args[]){
String parsestr[]=new String[3];
String parsename[]=new String[3];
String parsevalue[]=new String[3];
第 4章 字符串
String s="name=Boy&sex=male&age=20";
int i,j,k,count;
i=j=k=0;
while((j=s.indexOf('&',i))!=-1)
{
parsestr[k++]=s.substring(i,j);
i=j+1;
}
parsestr[k]=s.substring(i);
count=k+1;
for(i=0;i<count;i++)
{
第 4章 字符串
j=parsestr[i].indexOf('=');
parsename[i]=parsestr[i].substring(0,j);
j++;
parsevalue[i]=parsestr[i].substring(j);
}
for(i=0;i<count;i++)
Transcript.println(parsename[i]+"="+parsevalue[i]);
}
}
第 4章 字符串
图 4.8