当前位置:课程学习>>第五章 常用类>>文本学习>>知识点二
一、创建String对象
Java中将字符串作为String类型对象来处理,字符串是字符的序列,是用来组织和管理字符的对象。Java提供了两个字符串类:一个是创建之后不能改变的字符串类String类,另一个是创建之后可以动态修改的字符串类StringBuffer类。创建一个String对象后,被创建的字符串是不能被改变的,每次改变字符串(如使用“+”字符串连接符连接字符串)时都要创建一个新的String对象来保存新的内容,原始的字符串不变。String类和StringBuffer类都在java.lang包中定义,它们可以自动的被所有程序使用。两者均被说明为final,这意味着两者均不含子类,用户也不能创建其他类来继承这两个类。
字符串对象的创建有两种方法,一种是使用字符串常量(用双引号括起来的一串字符)直接赋值给一个字符串对象,Java编译器自动为每一个字符串常量生成一个String类的对象,因此可以用字符串常量直接初始化一个String对象,如:String str=”Hello world!”;另外一种方法就是调用String类提供的构造方法来创建String类的对象。目前在J2SDK5.0中String类的构造方法一共有14个:
String() //默认构造方法,创建空串
String(byte[] bytes) //用字节数组创建字符串
String(byte[] ascii, int hibyte) //过时的方法
String(byte[] bytes, int offset, int length) //bytes中offset开始的length个字节
String(byte[] ascii, int hibyte, int offset, int count) //过时的方法
String(byte[] bytes, int offset, int length, String charsetName) //指定字符集
String(byte[] bytes, String charsetName) //指定字符集,用bytes创建
String(char[] value) //字符数组创建字符串
String(char[] value, int offset, int count) //value中从offset开始的count个字符
String(int[] codePoints, int offset, int count) //Unicode代码点数组
String(String original) //字符串对象
String(StringBuffer buffer) //StringBuffer对象
String(StringBuilder builder) //StringBuilder对象
其中String(byte[] ascii, int hibyte)、String(byte[] ascii, int hibyte, int offset, int count)。这两个方法在J2SDK5.0等高版本中已经过时了,不提倡再使用。
【例5.3】使用String类的构造方法创建字符串对象。
1 //StringTest.java
2 public class StringTest
3 {
4 public static void main(String[] args)
5 {
6 byte b[]={97,98,99,100};
7 char c[]={'a','b','c','d','e','f'};
8 String s1=new String(b);
9 String s2=new String(b,1,2);
10 String s3=new String(c);
11 String s4=new String(c,2,3);
12 String s5=new String("Hello,how are you?");
13 System.out.println("s1="+s1);
14 System.out.println("s2="+s2);
15 System.out.println("s3="+s3);
16 System.out.println("s4="+s4);
17 System.out.println("s5="+s5);
18 }
19 };
程序的运行结果如图5.4所示。
图5.4 创建字符串对象的程序运行结果
二、String类中的常用方法
String类还提供了很多个用来操作字符串和字符串中字符的方法,最为常用的一些方法有:
(1) char charAt(int index)//返回字符串中index位置上的字符,其中index从0开始,到字符串长度减1。例子如下:
String str="test string";
char c=str.charAt(0);
System.out.println(c);
c=str.charAt(10);
System.out.println(c);
输出结果为:
t
g
如果把下标10换为11,即有这样的语句c=str.charAt(11);能够编译成功,但在运行的时候就会出现StringIndexOutofBoundsException异常,因为该字符串只有11个字符,下标只能到10为止。
(2) int compareTo(String str)、int compareToIgnoreCase(String str)//这两个方法均为按字典顺序比较字符串。若当前字符串小于str,则返回负数,若相同返回0,若大于则返回正数,数值为第一个不相同字符的Unicode码的差值,不过第二个方法是忽略大小写。例如:
String stra="testa string";
String strb="testc string";
String strc="test";
String strd="TEST";
System.out.println(stra.compareTo(strb));
System.out.println(strc.compareTo(strd));
System.out.println(strc.compareToIgnoreCase(strd));
由于stra和strb是第5个字符不相同,而a在字典中的位置要比c小,Unicode值a为97,c为99,因此比较结果为-2,同样strc和strd中的t在字典中的位置比T大32,因此比较结果为32,忽略大小写则相同。因此最终输出结果为:-2、32、0
(3) String concat(String str)//连接两个字符串,把str连接到当前字符串后,与字符串连接符“+”的作用相同。
(4) boolean endsWith(String str)、boolean startsWith(String str)、boolean startsWith(String str,int offset)//判断当前字符串是否以指定字符串str为后缀或前缀,是则返回true,否则返回false。其中offset表示从当前字符串的offset开始的子串中判断,若offset为负数或offset大于等于当前字符串的长度,则直接返回false。
(5) boolean equals(Object o)、boolean equalsIgnoreCase(String str)//比较两个字符串是否相同,相同则返回true,不同则返回false。
(6) int indexOf(int ch)、int indexOf(int ch,int fromIndex)、int indexOf(String str)、int indexOf(String str,int fromIndex)//从0或fromIndex位置开始查找第一次出现字符ch或字符串str的位置,若未找到则返回-1。若fromIndex为负数则从第一个字符开始查找,若fromIndex大于等于字符串长度则返回-1。
String stra="testa string";
System.out.print(stra.indexOf('s'));
System.out.print(“、”+stra.indexOf('s',-2));
System.out.print(“、”+stra.indexOf('b'));
System.out.print(“、”+stra.indexOf('s',12));
System.out.print("、"+stra.indexOf("str"));
输出结果为:2、2、-1、-1、6
(7) int lastIndexOf(int ch)、int lastIndexOf(int ch,int fromIndex)、int lastIndexOf(String str)、int lastIndexOf(String str,int fromIndex)//查找最后一次出现字符ch或字符串str的位置,若未找到则返回-1。若有fromIndex参数,则从fromIndex开始往前进行查找。为负数则返回-1,若fromIndex大于等于字符串长度则查找整个字符串。
String stra="testa string";
System.out.print(stra.lastIndexOf('s'));
System.out.print("、"+stra.lastIndexOf('s',-2));
System.out.print("、"+stra.lastIndexOf('b'));
System.out.print("、"+stra.lastIndexOf('s',4));
System.out.print("、"+stra.lastIndexOf('s',12));
System.out.print("、"+stra.lastIndexOf("str"));
输出结果为:6、-1、-1、2、6、6
(8) int length()//返回字符串长度
(9) String replace(char oldChar,char newChar)//以newChar替换字符串中所有的oldChar
(10) String substring(int beginIndex)、String substring(int beginIndexv,int endIndex)//取字符串中指定的子串
(11) String toUpperCase()、String toLowerCase()//转换字符串全为大写或全为小写
(12) static String valueOf(boolean b)、valueOf(char c)、valueOf(char[ ] data)、valueOf(char [ ] data,int offset,int count)、vlaueOf(double d)、valueOf(float f)、valueOf(int i)、valueOf(long l)、valueOf(Object obj)//返回参数的字符串表示
Java应用程序中main()方法中的参数就是一个字符串类的数组,不过该参数的传递与其他方法参数的传递不同,它是通过命令行传递过来,并保存到这个字符串数组中,在程序中可以对该数组进行其他操作。
【例5.4】 main()方法的参数传递。
1 //MainMethodParameter.java
2 public class MainMethodParameter
3 {
4 public static void main(String[] args)
5 {
6 System.out.println("parameter of main method has "+args.length+",them is:");
7 for(int i=0;i<args.length;i++)
8 System.out.println("string "+i+" on command line = "+args[i]);
9 }
10 };
保存该程序,编译后,在命令行输入//java MainMethodParameter one two three four,程序的运行结果如图5.5所示。
图5.5 main()方法参数传递后的运行结果
三、 StringBuffer类
String对象是常量字符串,一旦被初始化和赋值,它的值和所分配的内存就被固定了。如果改变它的值,将会产生一个包含新值的新String对象,这样会消耗掉很多资源。为了避免这种情况,Java中提供了另外一个创建后仍可更改的字符串StringBuffer类。
【例5.5】 String类对象占用空间的比较。
1 //TestString.java
2 public class TestString
3 {
4 public static void main(String[] args)
5 {
6 String s1 = "You are hired!";
7 String s2 = "You are hired!";
8 if (s1==s2)
9 System.out.println("占用一个内存空间");
10 else
11 System.out.println("占用两个内存空间");
12 s1 = s1.replace('h','f');
13 System.out.println(s1);
14 if (s1==s2)
15 System.out.println("占用一个内存空间");
16 else
17 System.out.println("占用两个内存空间");
18 }
19 }
程序的输出结果如图5.6所示。
图5.6 程序输出结果
对于StringBuffer类的对象就不会这样,把程序中的第6行、第7行替换为:
StringBuffer s1 = new StringBuffer("You are hired!");
StringBuffer s2 = new StringBuffer("You are hired!");
把第12行替换为:s1 = s1.replace(8,9,"f");保存后,重新编译运行,结果为:
占用两个内存空间
You are fired!
占用两个内存空间
StringBuffer提供了四个构造方法:StringBuffer()、StringBuffer(CharSequence seq)、StringBuffer(int capacity)、StringBuffer(String str)。StringBuffer类中大部分方法与String类中的方法相同,此外StringBuffer还提供了append()、insert()、delete()等用来修改字符串中字符的方法,方法的具体说明参考Java API文档。