Transcript "a","java"
全国高职高专计算机技能型人才培养系列规划教材
Java程序设计基础
第4章 字符串
www.avceit.cn
Contents
1
String 字符串类
2
StringBuffer字符串类
3
命令行参数
第4章
字符串
字符串是字符的序列,它是组织字符的基本数据结构,对于
大多数程序来说都是很重要的,即使在图形程序中也需要对
字符串(文件名和其他对象名)进行处理。字符串中可以包
含字母、数字和其他各种特殊字符,如+、-、*、/等。在有
些语言中(如C语言),字符串就是用字符数组来实现的,
而在Java中是将字符串当作对象来处理,它提供了一系列的
字符串操作方法,使字符串的处理更加容易和规范。
Java语言中的包java.lang中封装了final类String和
StringBuffer,其中类String对象是字符串常量,建立后不
能改变。而类StringBuffer对象类似于一个字符缓冲区,建
立后可以修改。这两个类共同的特点都不能再派生子类,即
它们不能被其他类继承。
4.1 String 字符串类
首先要清楚的是,字符串常量和字符常量的区别。
字符常量是用单引号括起来的单个字符,
如’a’,’3’,’\052’等。而字符串常量是用双引号括
起来的字符序列,如"a","java","\n"等。在Java
中,每个字符串常量对应一个String类的对象,
所以一个字符串常量可以直接调用类String中提
供的方法,例如:
int len= "hello".length();
将得到字符串的长度5,字符串的长度即字符串中
字符的个数。
本节主要讨论存放字符串常量的String类,包括
String对象的创建、使用和操作。
4.1.1 类String字符串的创建
String类是字符串常量类,String对象建立
后不能修改。以前使用的每个字符串常量
实际上都是String对象,如字符串“hello”
在编译后即成为String对象。因此,可以用
字符串常量直接初始化一个String对象。
例如:
String s="Java Program";
通过类String提供的默认的构造方法不需
要任何参数,它生成一个空字符串。如:
Sting s=new String();//建立一个空字符串
对象
通过使用类String提供的构造方法,除了
可以生成一个空字符串,还可以用字符数
组或字节数组来生成一个字符串对象。其
他创建String对象的构造方法如表6-1所示。
构造方法
功能
String(String value)
用常量串value创建一个字符串对象
String(StringBuffer buffer)
用变量串buffer创建一个字符串对象
String(char value[])
用字符数组value创建一个字符串对象
String(char value[],int
offset,int count)
用字符数组value的offset位置开始的
count个字符,创建一个字符串对象
String(byte ascii[],int hiByte) 用字节数组ascii创建一个字符串对象,
Unicode字符的高位字节为hiByte,
通常应该为0
String(byte ascii[],int
hiByte,int startIndex,int
count)
用字节数组ascii 从startIndex位置开
始的count个字符创建一个字符串对
象, hiByte通常为0
注意:
由于在Internet上通常使用的字符都为8位
的ASCII码,Java提供了从字节数组来初始
化字符串的方法,并且用hiByte来指定每
个字符的高位字节。对ASCII码来说,
hiByte应为0,对于其他非拉丁字符集,
hiByte的值应该非0。
【 例4.1】 String构造方法的使用。
public class UseConstructors{
public static void main(String args[]){
String s1,s2,s3,s4,s5,s6,s7;
byte b[]={(byte)'J',(byte)'a',(byte)'v',(byte)'a'};
char c[]={'基','础','教','程'};
StringBuffer sb =new StringBuffer("你好");
s1=new String();
System.out.println("s1="+s1);
s2=new String("Hello");
System.out.println("s2="+s2);
s3=new String(sb);
System.out.println("s3="+s3);
s4=new String(c);
System.out.println("s4="+s4);
s5=new String(c,0,2);
System.out.println("s5="+s5);
s6=new String(b,0);
System.out.println("s6="+s6);
s7=new String(b,0,1,2);
System.out.println("s7="+s7);
}
}
4.1.2 类String字符串处理的常用方法
类String中提供的访问String字符串的方法很多,大体上
可分为比较、判断前后缀、单个字符的查找、子字符串定
位、连接和类转换等几类。
1.类String字符串的比较
(1)boolean equals(Object anObject)和boolean
equalsIgnoreCase(String anString)
功能:用来比较两个字符串的值是否相等,不同的是后者
忽略字母的大小写。例如下面的表达式:
"java".equals("java")
//值为true
"java".equalsIgnoreCase("JAVA")
//值为true
注意:它们与运算符“==“实现的比较是不同的。运算符
“==“比较两个字符串对象是否引用同一个实例对象,而
equals()和equalsIgnoreCase()则比较两个字符串中对应
的每个字符是否相同。
例如:
String s1= new String("java");
String s2= new String("java");
String s3=s1;
System.out.println(s1==s2);
System.out.println("java"=="java");
System.out.println(s1==s3);
System.out.println(s1.equals(s2));
(2)int compareTo(String anString) 和int
compareToIgnoreCase(String str)
功能:用于比较两个字符串的大小,所不同的是后者忽略字母大小写。
通过返回的整数值指明当前字符串与参数字符串的大小关系。若调用
串比参数串大,返回正整数;反之,返回负整数;相等则返回0。
比较方法:
若比较的两个字符串有不同的字符,则从左边数起的第一个不同字符
的大小即两个字符串的大小,字符的大小建立在Unicode字符集基础
上,方法的返回值为:
调用串中的第一个不同字符-参数串中的第一个不同字符。
例如:
"this".compareTo("that")
//值为8;因为i-a=8
若比较的两个字符串各个位置的字符都相同,仅长度不同,则方法的
返回值为:
调用串的长度-参数串的长度
例如:
"abcd".compareTo("abc")
//值为4-3=1
(3)boolean regionMatches(int toffset,String other,int
ooffset,int len)和
boolean regionMatches(Boolean ignoreCase,int toffset,String
other,int ooffset,int len);
功能:用于比较两个字符串中指定区域的子字符串是
否相同。
其中,toffset和ooffset分别指明当前字符串和参数字
符串中所要比较的子字符串的起始位置,len指明比
较的字符个数(长度),而ignoreCase指明比较时是否
区分大小写,若无此参数,比较是区分大小写的。
例如:
"Java".regionMatches(0,"java",0,4)
//false
"Java".regionMatches(true,0,"java",0,4)
//true
2.判断字符串的前缀和后缀
boolean startsWith(String prefix)和
boolean endsWith(String suffix)
用于判断当前字符串的前缀和后缀是否和指定的
字符(或字符串)相同。如:
居民身份证的最后一位数字表示性别,奇数为男
性,偶数为女性,则可通过下面的语句来辨别某
位居民的性别:
if(s.endsWith("1")||s.endsWith("3")||s.endsWith("
5") ||s.endsWith("7")||s.endsWith("9"))
{System.out.println("此人为男性");}
else {System.out.println("此人为女性");}
3.字符串中单个字符的查找
(1)char charAt(int index)
功能:返回字符串在index处的字符,index的值
从0到串长度减1。例如:
System.out.println("Java".charAt(1)); //输出为a
(2)int indexOf(int ch); 和
int indexOf(int ch,int fromIndex)
功能:返回当前字符串中某特定字符ch出现的位
置。第1种方法从前向后顺序查找,
第2种方法从指定位置fromIndex之后开始查找,
若找到,则返回该字符第1次出现的位置序号,否
则返回-1。
【 例4.2】 indexOf的使用
class UseIndexOf{
public static void main(String args[]){
String s="java program language";
int i=-1;
do{
i=s.indexOf((int)'g',i+1);
System.out.print(i+"\t");
}while(i!=-1);
}
}
运行结果:
8 16
19
-1
4.类String子字符串的定位
1. int indexOf(String str)和
int indexOf(String str,int fromIndex)
int lastIndexOf(String str)和
int lastIndexOf (String str,int fromIndex)
方法indexOf()的功能是从前向后查找指定子
字符串在主串中出现的位置。
方法lastIndexOf()的功能是从后向前查找指
定子字符串在主串中出现的位置。
例4.3 lastIndexOf的使用
class UseLastIndexOf{
public static void main(String args[]){
String s="java program language";
int i=s.length();
do{
i=s.lastIndexOf("g",i-1);
System.out.print(i+"\t");
}while(i!=-1);
}
}
运行结果:
19
16
8
-1
2. String substring(int beginindex)
String substring(int beginindex,int
endindex)
功能:返回子字符串。前者从主串的
beginindex处开始到串尾获取一个子串返回;
后者从主串的beginindex处开始到
endindex-1处获取一个子串返回,子串的长
度=endindex-beginindex。
【 例4.4】 substring方法的使用
class UseSubstring
{
public static void main(String args[])
{
String s1="java program language";
int beginindex=s1.indexOf("p");
int endindex=s1.lastIndexOf("m");
String s2=s1.substring(beginindex,endindex+1);
System.out.println(s2);
}
}
运行结果:
program
5.字符串的连接
String concat(String str);
功能:将str连接到主串的末尾,并返回连接后的
字符串,但是主串本身并没有改变。
如下面的例子:
String s="java";
System.out.println(s.concat("程序设计");
System.out.println(s);
运行结果:
java程序设计
java
注意:在java中,重载的运算符"+"也可以实现字
符串的连接或字符串与其他类对象的连接。
6.String类的转换
(1)static String valueOf(Object obj)
功能:将其他类的参数转换为字符串对象并返回。由于Object类是所
有类的父类,所以此方法是重载的,参数可以是java中的任何类型。
例如:
double x=3.1415926;
String s=String.valueOf(x); //将double类型转换成String类的对象
注意:其他类也提供了方法valueOf(),用来将一个字符串转换成相
应类的对象。
例如:
String s="3.1415926";
Double d=Double.valueOf(s); //将String类的对象转换成Double类的
对象
double y=d.doubleValue(); //将Double类的对象转换成double类型的
数据
(2)toString()
该方法的功能是把其他类的对象转换成字符串对象。
如:
String s=Integer.toString(34,16); //将十进制数34转换成
16进制字符串
System.out.println(s);
//输出为22
(3)toCharArray()
该方法的功能是将字符串转换成一个字符数组。
如:
String s1="We like orange";
char s2[]=s1.toCharArray();
System.out.println(String.valueOf(s2,8,6);
输出结果:
orange
7.类String的其他方法
(1)字符串中字符大小写的转换
可以利用String类提供的下列方法进行转换。
①public String toLowerCase()
该方法将字符串中所有字符转换成小写,并返回转换
后的新串。
②public String toUpperCase()
该方法将字符串中所有字符转换成大写,并返回转换
后的新串。
(2)去除字符串中多余空格
public String trim()
该方法只是去掉开头和结尾的空格,并返回得到的新字符
串。值得注意的是,在字符串中间的空格并不会被去掉。
(3)字符串中字符的替换
①public String replace(char oldChar,char newChar)
该方法用字符newChar替换当前字符串中所有是
oldChar的字符,返回一个新字符串。
②public String replaceFirst(String regex, String
replacement)
该方法用字符串replacement的内容替换当前字符串中
遇到的第一个和字符串regex相一致的子串,并将产生的
新字符串返回。
③public String replaceAll(String regex, String
replacement)
该方法用字符串replacement的内容替换当前字符串中
所有和字符串regex相一致的子串,并将产生的新字符串
返回。
4.2 StringBuffer字符串类
与实现字符串常量的String类不同的是,
StringBuffer类的每个对象都是可以扩充和
修改的字符串变量,使用起来比String类更
加方便。
本节主要讨论存放字符串变量的
StringBuffer类,包括StringBuffer对象的创
建、使用和修改操作。
4.2.1 类StringBuffer字符串的创建
构造方法
功能
StringBuffer() 建立空的字符串对象,系统为字符串分配16
个字符大小的缓冲区
StringBuffer
(int length)
建立长度为length的字符串对象,字符串缓
冲区的初始长度也为length
StringBuffer
(String str)
建立一个初值为String类对象str的字符串
对象,同时系统还为该串分配16个字符大
小的空间
4.2.2 类StringBuffer字符串的常用方法
1.字符设置和替换
(1)void setCharAt(int index,char ch)
功能:设置指定位置index的字符值为ch
如:StringBuffer str=new StringBuffer("stident");
str.setCharAt(2, ‘u’)
//将str字符串中的第二个字符
替换为u
(2) StringBuffer replace(int start,int end,String str)
功能:将StringBuffer对象字符串从start至end-1处,用字符
串str来替换
如: StringBuffer str=new StringBuffer("happy new year");
System.out.println(str.replace(6,14, "birthday"));
输出结果 :
happy birthday
2.设置/获取类StringBuffer字符串对象长度和容量
(1)void setLength(int newLength)
功能:设置字符串的长度为newLength,这时字符串缓冲区
中指定长度以后的字符值均为零
(2) int length()
功能:获取字符串对象的长度
(3)void ensureCapacity(int minimumCapacity)
功能:设定字符串缓冲区的大小,保证缓冲区的容量至少为
指定的值minimumCapacity,若当前缓冲区容量小于参数
值,则分配新的较大的缓冲区,新容量取以下两者中的大
者:
•参数minimumCapacity的值
•老容量的两倍加2
(4)int capacity()
【 例4.5】 StringBuffer字符串长度Length和容量Capacity的设
置和获取
public class LengthAndCapacity
{
public static void main(String args[])
{
StringBuffer sb1=new StringBuffer();
StringBuffer sb2=new StringBuffer(30);
StringBuffer sb3=new StringBuffer("abcde");
System.out.println("sb1.capacity="+sb1.capacity());
System.out.println("sb1.length="+sb1.length());
System.out.println("sb2.capacity="+sb2.capacity());
System.out.println("sb2.length="+sb2.length());
System.out.println("sb3.capacity="+sb3.capacity());
System.out.println("sb3.length="+sb3.length());
sb2.ensureCapacity(50);
sb3.setLength(3);
System.out.println("sb2.capacity="+sb2.capacity());
System.out.println("sb2.length="+sb2.length());
System.out.println("sb3.capacity="+sb3.capacity());
System.out.println("sb3.length="+sb3.length());
}
}
【 例4.6】 在StringBuffer字符串末尾添加内容
public class StringBufferAppend
{
运行结果:
public static void main(String args[])
happynewyear
{
sb.capacity=21
StringBuffer sb=new StringBuffer("happy"); sb.length=12
sb.append("new");
sb.append("year");
System.out.println(sb);
System.out.println("sb.capacity="+sb.capacity());
System.out.println("sb.length="+sb.length());
}
}
(2)StringBuffer insert(int offset,char ch)
功能:在字符串的指定位置offset处插入字符ch
【 例4.7】 StringBuffer字符串的insert方法的使用
public class UseInsert
{
运行结果:
public static void main(String args[])
helloworld
{
StringBuffer sb=new StringBuffer("world");
sb.insert(0,"hello");
System.out.println(sb);
}
}
【例4.8】 对StringBuffer字符串进行颠倒操作
public class UseReverse
{
public static void main(String args[])
{
StringBuffer sb1=new StringBuffer("abcde");
StringBuffer sb2=sb1.reverse();
System.out.println(sb1);
System.out.println(sb2);
}
运行结果:
}
edcba
edcba
4.获取类StringBuffer对象的子字符串或字符
(1)void getChars(int srcBegin,int srcEnd,char[]
dst,int dstBegin)
功能:将StringBuffer对象字符串中字符复制到目标
字符数组dst中去。复制的字符从srcBegin处开始,
到srcEnd-1处结束,复制字符的个数为srcEndsrcBegin,字符被复制到目标数组dst的dstBegin
至dstBegin+(srcEnd-srcBegin)-1处
如:char c[]={"***********"};
StringBuffer sb=new StringBuffer("hello");
sb.getChars(0,5,c,3);
System.out.println(c);
//输出***hello***
(2)String substring (int start)和String
substring(int start,int end)
功能:获取StringBuffer字符串对象从start处开始的
子串;获取StringBuffer字符串对象从start开始到
end-1处的子串。
如:
StringBuffer sb=new StringBuffer("java
program");
System.out.println(sb.substring(5));
//输出
program
System.out.println(sb.substring(0,4));
//输出
java
5.类型转换
类StringBuffer重写了方法tostring(),可将类
StringBuffer的对象转换成类string的对象.
如:
StringBuffer sb=new StringBuffer("java");
String s=sb.toString();
System.out.println(s);
4.3 命令行参数
在main()方法名后的括号中有String类的数组参数args,
是用来接收Java命令行传送给java应用程序的数据。命令
行参数就是在执行字节码文件时,命令行上字节码文件名
后给出的内容。例如:
java UseString hello java world
其中:UseString是字节码文件名,hello java world就是
命令行参数
Java通过args字符串数组来得到并处理这些内容,命令行
参数有多个时,要用空格隔开,这些参数将按顺序逐个存
入args数组中,第一个参数hello存入args[0],第二个参数
java存入args[1],第三个参数world存入args[2]。
注:要想将包含有多个空格的单词作为一个字符串时,可
用引号括起来。如:
java UseString "hello java world"
【 例4.9】
public class Command
{
public static void main(String args[])
{
for(int i=0;i<args.length;i++)
{System.out.println("args["+i+"]="+args[i]);}
}
}
若执行程序的命令为:
java Command hello java
则程序运行结果为:
args[0]=hello
args[1]=java
【 例4.10】 用命令行参数方式提供两个整数,把它们相乘
后输出。
public class UseComLParam{
public static void main(String args[]){
int s,s1,s2;
if(args.length<2)
{
System.out.println("运行本程序需提供两个命令行参数");
System.exit(0);
}
执行该程序的过程如下:
s1=Integer.parseInt(args[0]);
编译:javac UseComLParam.java
s2=Integer.parseInt(args[1]);
运行:java UseComLParam 3 4
s=s1*s2;
运行结果:
System.out.println(s1+"*"+s2+"="+s); 3*4=12
}
}
本章小结
通过本章的学习了解Java中字符串类的基本概念,掌握字
符串的一些常用方法及其使用。字符串指的是字符的序列,
用双引号括起来的字符的序列都是字符串。
在Java有两种类型的字符串:一种是创建以后不需要改变
的,称为字符串常量,在Java中,String类用于存储和处
理字符串常量;另外一种字符串是创建以后,需要对其进
行改变的,称为字符串变量,在Java中,StringBuffer类
用于存储和操作字符串变量。
通过实验训练,掌握两种字符串的一些常用的方法来解决
Java中的一些文字问题,将十分方便。
字符串可以作为main()方法的参数,传递给应用程序,利
用String args[]数组来进行操作,输入时放在命令行字节
码文件名的后面,称为“命令行参数”,它是向Java
Application程序传递参数数据的常用而且有效的手段。
全国高职高专计算机技能型人才培养系列规划教材
www.avceit.cn