Java之字符串处理

Java中的字符串也是一连串的字符。

在Java中与其他的计算机语言将字符串作为字符数组处理不同,Java将字符串作为String类型对象来处理。

将字符串作为内置的对象处理允许Java提供十分丰富的功能特性以方便处理字符串。

 

Java语言中,String对象有如下的特性:

当创建一个String对象时,被创建的字符串是不能被改变的。也就是说,一旦一个String对象被创建,将无法改变那些组成字符串的字符。

每次需要改变字符串时都要创建一个新的String对象来保存新的内容。原始的字符串不变。

Java中这么做的目的是:实现固定的,不可变的字符串比实现可变的字符串更高效。

 

在Java中,若想得到改变字符串的情况,有一个叫做StringBuffer的String的友类。它的对象包含了在创建之后可被改变的字符串。

 

String类和StringBuffer类都定义在java.lang中,因此,它们可以自动的被所有程序利用。两者均被声明为final,这意味着两者均不含子类。

 

包含在类型String对象中的字符串的不可改变意味着String实例一旦被建立,它的内容将不能被改变。然而在任何时候,被说明为String引用的变量可以被改变以指向另外的一些字符串(String)对象。

 

1.String构造函数

1)  默认构造函数

创建空String的构造函数。

String s = newString(); //创建一个String实例,该实例中不包含字符。


2)  创建一个被字符数组初始化的字符串(String)

String(charchars[ ])

举例:

Char chars[] = {‘a’,‘b’, ‘c’, ‘d’};
String s = newString(chars);     //用字符串”abcd”初始化s


3)  指定字符数组的一个子区域作为初始化值

String(charchars[], int startIndex, int numChars)

其中 startIndex指定了子区域开始的下标,numChars指定所用字符的个数。

举例:

Char chars[] = {‘a’,‘b’, ‘c’, ‘d’, ‘e’, ‘f’};
String s = new String(chars, 2, 3); // 用字符cde初始化s

4)  用另一个String对象来构造一个String对象

String(StringstrObj)

举例:

Char c[] = {‘j’,‘a’, ‘v’, ‘a’};
String s1 = newString(c);
String s2 = newString(s1);        //s1与s2的字符序列相同

 

注:当从一个数组创建一个String对象时,数组的内容将被复制。在字符串被创建以后,如果改变数组的内容,String将不会随之改变。

 

2.Java中求字符串长度

字符串的长度是指其所包含的字符的个数。调用length()方法可以得到这个值:

int length()

例如:

char chars[] = {'a', 'b', 'c'};
String s = new String(chars);
System.out.println(s.length());


3. 特殊的字符串操作

1)字符串文字

前面举例说明了如何使用new运算符从一个字符数组明确地创建一个String实例。 

然而,在Java中,对于程序中的每一个字符串常量,Java会自动创建String对象。因此,可以使用字符串常量来初始化String对象。

例如:

String s = “abc”; // use string literal


2)字符串链接

在Java中通常不允许对String对象进行操作。不过有一个例外就是+运算符,它可以连接两个字符串,产生一个String对象。也允许使用一连串的+运算符,

例如:

String age = "9";
String s = "He is " + age + " years old.";
System.out.println(s);  //初始字符串为:He is 9 years old.


字符串连接的一个实际使用是当创建一个很长的字符串时,可以将它拆开,使用+运算符将它们连接起来。避免源代码中长字符串的换行。


3)字符串与其他类型数据的连接

字符串可以和其他类型的数据连接。

例如:

int age = 9;
String s = "He is " + age + " years old.";

注:在Java中,+运算符中主要有一个运算数是字符串(String)实例,编译器就将另一个运算数转换为它的字符串形式。

例如:

String s = "four: " + 2 + 2;

System.out.println(s); //输出为:four: 22, 而不是four: 4,因为运算符的优先级造成了首先是“four”和与2相应的字符串的连接,这个连接的结构再和2相应的字符串连接。

若要先实现整数加,就应该使用圆括号,

例如:

String s = "four: " + (2 + 2);
System.out.println(s); //输出为:four: 4


4)字符串转和toString()

当Java在连接时将数据转换为其字符串形式时,它是通过调用一个由字符串(String)定义的字符串转换方法valueOf()的重载来完成的。
valueOf()方法对所有简单的类型和类型Object重载。对于简单类型,valueOf()方法返回一个字符串,该字符串包含了相应其被调用的值的可读值。对于对象,valueOf()方法调用toString()方法。在本章后面我们将更仔细地分析valueOf()方法。这里让我们讨论toString()方法,因为通过它可以确定所创建类的对象的字符串形式。每一个类都执行toString()方法,因为它是由Object定义的。
然而toString()方法的默认实现是不够的。对于所创建的大多数类,通常想用你自己提供的字符串表达式重载toString()方法。幸运的是这很容易做到。


toString()方法具有如下的一般形式:
String toString( ) 

实现toString()方法,仅仅返回一个String对象,该对象包含描述类中对象的可读的字符串。通过对所创建类的toString()方法的覆盖,允许将得到的字符串完全集成到Java的程序设计环境中。例如它们可以被用于print( )和println( )语句以及连接表达式中。

例如,对于定义的类Box

Box b = new Box();
System.out.println(b); //当Box对象在连接表达式中使用或出现在调用println()中时,Box的toString()方法被自动调用


4.字符截取

Java中String类提供了很多从String对象中截取字符的方法。尽管在一个String对象中构成字符串的字符不能像字符数组一样被索引。

1)charAt()

从一个字符串(String)中截取一个字符。可以通过charAt()方法直接引用单个字符。其一般形式如下:

char charAt(int where); //where是想要得到的字符的下标。where的值是非负的,返回where位置处的字符。

例如:

char ch;
ch = "abc".charAt(1); // ‘b’赋给ch


2)getChars()

若想一次截取多个字符,可以使用getChars()方法,其一般形式如下:

void getChars(int sourceStart, int sourceEnd, char target[ ], int targetStart);

 sourceStart指定了子字符串开始的下标,sourceEnd指定了子字符串结束的下一个字符的下标。因此,子字符串包含了从sourceStart到sourceEnd-1的字符。获得字符的数组由target所指定。将被复制子字符串于其中的target的下标由targetStart指定。

注:必须确保数组target应该足够大以保证能容纳被指定子字符串中的字符。

例如:

String s = "This is a demo of the getChars method.";
int start = 10;
int end = 14;
char buf[] = new char[end - start];
s.getChars(start, end, buf, 0);
System.out.println(buf); //输出为demo


3)getBytes()

该函数实现将字符存放于字节数组中的getChars()方法的替代,它使用平台提供的默认的字符到字节的转换。

最简单的形式如下:

byte[ ] getBytes()


也可以使用其他形式,在将字符串(String)值输出到一个不支持16位Unicode编码的环境时,getBytes()是最有用的。例如,大多数的Internet协议和文本文件格式在文本交换时使用8位ASCII编码。


4)toCharArray()

若想 将字符串(String)对象中的字符转换为一个字符数组,最简单的方法就是调用toCharArray()方法。对应整个字符串,它返回一个字符数组,其一般形式为:

char[] toCharArray()

也可以用getChars()方法获得相同的结果