字符串的长度是指其所包含的字符的个数。调用如下的length( )方法可以得到这个值:
int length( )
下面的程序段输出“3”,因为在字符串s中有三个字符。
char chars[] = { 'a', 'b', 'c' };
String s = new String(chars);
System.out.println(s.length());
特殊的字符串操作
因为字符串是程序中的一个通用和重要的部分,Java为字符串操作在语法中增加了特殊的支持。这些操作包括从字符串常量自动创建新的String实例。通过+运算符连接多个String对象以及将其他的数据类型转换成字符串形式。尽管有显式的方法去执行这些函数,而为了方便程序员,Java会自动执行它们。
字符串文字
前面的例子说明了如何通过使用new运算符从一个字符数组明确地创建一个String实例。然而这是一种早期的使用字符串常量的处理方法。对于程序中的每一个字符串常量,Java会自动创建String对象。因此,可以使用字符串常量初始化String对象。例如,如下的程序代码段创建两个相等的字符串。
char chars[] = { 'a', 'b', 'c' };
String s1 = new String(chars);
String s2 = "abc"; // use string literal
由于对应每一个字符串常量,有一String对象被创建,因此在使用字符串文字的任何地方,都可以使用String对象。例如,可以直接对引用字符串调用方法,如同它是一个对象引用,如下面语句所显示的那样。以字符串“abc”调用方法length( ),正如所料,输出“3”。
System.out.println("abc".length());
通常,Java不允许对String对象进行操作。这一规则的一个例外是+运算符,它可以连接两个字符串,产生一个String对象。也允许使用一连串的+运算符,例如下面的程序段将三个字符串连接起来:
String age = "9";
String s = "He is " + age + " years old.";
System.out.println(s);
输出为字符串“He is 9 years old.”。
字符串连接的一个实际使用是当创建一个很长的字符串时,可以将它拆开,使用+将它们连接起来,避免源代码中长字符串的换行,下面是一个例子:
// Using concatenation to prevent long lines.
class ConCat {
public static void main(String args[]) {
String longStr = "This could have been " +
"a very long line that would have " +
"wrapped around. But string concatenation " +
"prevents this.";
System.out.println(longStr);
}
}
字符串与其他类型数据的连接
字符串可以和其他类型的数据连接。例如,考虑与前面的例子略有差别的一个例子:
int age = 9;
String s = "He is " + age + " years old.";
System.out.println(s);
在这里,age是一个整型(int)而不是另一个字符串(String)型值,但是程序的输出与前面的例子相同。这是因为在字符串(String)对象中age的整型(int)值自动转换为它的字符串(String)形式。
然后这个字符串就和前面一样被连接。只要+运算符的一个运算数是字符串(String)实例,编译器就将另一个运算数转换为它的字符串形式。
应当小心的是当你将其他类型的操作与字符串连接表达式混合时,有可能得到意想不到的结果。看下面例子:
String s = "four: " + 2 + 2;
System.out.println(s);
程序显示:
four: 22
而不是
four: 4
虽然这可能是你期望得到的。这是为什么呢?这是因为运算符的优先级造成了首先是“four”和与2相应的字符串的连接,这个连接的结果再和与2相应的字符串连接。若要先实现整数加,就应该使用圆括号。像下面这样:
String s = "four: " + (2 + 2);
现在s包含了字符串“four:4”。
字符串转换和toString( )
当Java在连接时将数据转换为其字符串形式时,它是通过调用一个由字符串(String)定义的字符串转换方法valueOf( )的重载来完成的。valueOf( )方法对所有简单的类型和类型Object重载。
对于简单类型,valueOf( )方法返回一个字符串,该字符串包含了相应其被调用的值的可读值。
对于对象,valueOf( )方法调用toString( )方法。
这里让我们讨论toString( )方法,因为通过它可以确定所创建类的对象的字符串形式。每一个类都执行toString( )方法,因为它是由Object定义的。然而toString( )方法的默认实现是不够的。对于所创建的大多数类,通常想用你自己提供的字符串表达式重载toString( )
方法。幸运的是这很容易做到。toString( )方法具有如下的一般形式:
String toString( )
实现toString( )方法,仅仅返回一个String对象,该对象包含描述类中对象的可读的字符串。
通过对所创建类的toString( )方法的覆盖,允许将得到的字符串完全集成到Java的程序设计环境中。例如它们可以被用于print( )和println( )语句以及连接表达式中。下面的程序中用Box类重载toString( )方法说明了这些。
// Override toString() for Box class.
class Box {
double width;
double height;
double depth;
Box(double w, double h, double d) {
width = w;
height = h;
depth = d;
}
public String toString() {
return "Dimensions are " + width + " by " +
depth + " by " + height + ".";
}
}
class toStringDemo {
public static void main(String args[]) {
Box b = new Box(10, 12, 14);
String s = "Box b: " + b; // concatenate Box object
System.out.println(b); // convert Box to string
System.out.println(s);
}
}
该程序的输出如下所示:
Dimensions are 10.0 by 14.0 by 12.0
Box b: Dimensions are 10.0 by 14.0 by 12.0
正如你能看到的那样,当Box对象在连接表达式中使用或出现在调用println( )中时,Box的toString( )方法被自动调用。