字符
Java用char类型来表示字母、数字、标点符号以及其他特殊字符。Java基于Unicode4.0来表示每一个字符,Unicode的设计目标是容纳世界上所有主要语言中的字符。
Java使用16位即2个字节来表示字符,这意味着Java可以表示216,即65536个字符,看起来很多,但是还不能支持整个Unicode标准中的所有字符。如果超过这个范围,Java允许使用int类型来表示字符,int类型字长4个字节32位,可以表示232位的字符。
Java中表示字符的最简单的方式如下,使用单引号嵌入字符:
char capitalA = 'A';
字符从本质上讲是数字。每一个字符映射到一个范围在0到65 535的正整数,每一个字符在Unicode标准中都有对应的数字值,称为Unicode值。我们可以用如下方法来查看字符的Unicode码:
char word = 'A';
int p = 65;
System.out.println("a在unicode表中的顺序位置是:" + (int) word);
System.out.println("unicode表中的第65位是:" + (char) p);
并不是所有的字符都可以通过键盘输入到计算机。您可以用Unicode转义符(\u或者\U,后面跟着四位的十六进制数字)来表示Unicode字符:
char word = '\U0041'
特殊字符
Java定义了一些用来格式化输出的特殊字符。Java使用转义符来表示这些特殊字符,该转义符由一个反斜线(\)和一个随后的助记符组成:
回车 '\r'
换行 '\n'
Tab '\t'
换页 '\f'
退格 '\b'
由于一对单引号和反斜线对于字符表示有特殊的意义,所以您必须用转义符来表示它们。
单引号 '\'
换码符 '\\'
双引号 '\'''
注意:双引号不需要转义。
字符串
字符串对象表示固定长度的字符序列,String类可能是Java程序中使用的最频繁的类了。
来看两种创建字符串的方式:
String a = "abc";
String b = new String("abc");
实际运用中,我们要避免第二种方式,第二种方式创建了两个String对象。首先,Java虚拟机创建了String对象“abc”。然后,java虚拟机创建一个新的String对象,并把字符串“abc”传入构造函数。这是一次完全没有必要的构造,既影响了性能,也提高了代码阅读难度。
由于字符串是字符序列,所以可以嵌入特殊字符。
String s = "\t\n";
字符连接
您可以将一个字符串和另一个字符串连接起来,从而生成第三个字符串。
String abcd = "ab".concat("cd")
在Java中,字符串连接是一个非常常用的操作。您可以用加号(+)作为字符串连接的捷径。
String abcd = "ab" + "cd";
在实际编码中,我们也基本都是这么做的。
+符号既可以操作数值的加减,也可以用于连接字符串,这叫做操作符的重载。
字符串的不可改变性
在JavaAPI文档中我们可以看到String类的定义:
public final class String extends Object implements Serializable, Comparable, CharSequence
String类是一个final类,这代表一个String对象是不可改变的,String类的方法中我们也找不到任何能够改变字符串的值和长度的方法。这就是字符串的不可改变性。
当我们进行连接字符串操作的时候,Java虚拟机没有改变其中任何一个字符串,而是创建了一个新的String对象,把连接后的结果赋予了它。Sun将String设计成不可改变的,这是为了让String的行为最优化。因为String在多数应用中都被大量使用,所以它的优化是非常关键的。
StringBuilder
类java.lang.StringBuilder提供了动态创建字符串的能力。使用方法上与StringBuffer是一样的,不同之处在于,StringBuilder不是线程安全的,但是更搞笑,StringBuffer是现成安全的。
系统属性
在程序中,我们经常直接在字符串中写入特殊字符,比如换行符"\n",这样做不仅冗余,而且难以移植,不同平台的换行符也不同。
类java.lang.System中可以找到这个问题的解决方案,该类包含了方法getProperty,此方法以一个系统属性的键值作为参数,并返回与该键值相关联的系统属性。Java虚拟机在启动的时候,就设置好了若干系统属性。多数属性返回与虚拟机以及当前执行环境相关的信息。API文档中针对getProperties方法,给出了可用的属性列表。例如换行符的属性是line.separator。