字符串的长度是指其所包含的字符的个数。调用如下的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( )方法被自动调用。