当前位置:课程学习>>第五章 常用类>>文本学习>>知识点二


知识点二  字符串




一、创建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所示。

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.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所示。

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文档。

 

进入知识点三学习