Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String。每个用双引号括起来的字符串都是String类的一个实例:
String e=""; //一个空的字符串
String greeting="Hello";
子串
String 类的 substring 方法可以从一个较大的字符串提取出一个子串。例如:
String greeting="Hello";
String s=greeting.substring(0,3); //等价于s="Hel";
substring 方法的第二个参数是不想复制的第一个位置。在 substring 中从 0 开始计数,直到 3 为止, 但不包含 3。字符串 s.substring(a, b) 的长度为 b-a。
拼接
与绝大多数的程序设计语言一样,Java语言允许使用 + 号连接(拼接)两个字符串。
String expletive = "Expletive";
String PC13 = "deleted";
String message = expletive + PC13; //等价于 message = "Expletivedeleted"
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。如果需要把多个字符串放在一起, 用一个定界符分隔,可以使用静态 join 方法:
String all=String.join("/","S","M","L","XL"); //等价于all="S/M/L/XL"
不可变字符串
String 类没有提供用于修改字符串的方法。由于不能修改 Java 字符串中的字符, 所以在 Java 文档中将 String 类对象称为不可变字符串, 如同数字 3 永远是数字 3。
检测字符串是否相等
可以使用 equals 方法检测两个字符串是否相等。对于表达式:
s.equals(t)
如果字符串 s 与字符串 t 相等, 则返回 true ; 否则, 返回 false。需要注意,s与 t 可以是字符串变量, 也可以是字符串字面量。例如:
"Hello".equals(greeting)
要想检测两个字符串是否相等,而不区分大小写, 可以使用 equalsIgnoreCase 方法。
"Hello".equalsIgnoreCase("hello")
一定不要使用==运算符检测两个字符串是否相等! 这个运算符只能够确定两个字串是否放置在同一个位置上。
空串与Null串
空串 “” 是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:
if(str.length()==0)
if(str.equals("")
空串是一个 Java 对象, 有自己的串长度( 0 ) 和内容(空)。不过, String 变量还可以存放一个特殊的值, 名为 null, 这表示目前没有任何对象与该变量关联。要检查一个字符串是否为 null, 要使用以下条件:
if(str==null)
有时要检查一个字符串既不是 null 也不为空串,这种情况下就需要使用以下条件:
if (str != null && str.length() != 0)
首先要检查 str 不为 null。
码点与代码单元
Java 字符串由 char 值序列组成。 char 数据类型是一个采用 UTF-16 编码表示 Unicode 码点的代码单元。大多数的常用 Unicode 字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length 方法将返回采用 UTF-16 编码表示的给定字符串所需要的代码单元数量。
String greeting="Hello";
int n =greeting.length(); //5
要想得到实际的长度,即码点数量,可以调用
int cpCount=greeting.codePointCount(0,greeting.length());
调用 s.charAt(n) 将返回位置 n 的代码单元,n 介于 0 ~ s.length()-1之间。
String API
Java 中的 String类包含了 50 多个方法。令人惊讶的是绝大多数都很有用, 可以设想使用的频繁非常高。下面的 API 注释汇总了一部分最常用的方法。
方法名 | 实现功能 |
---|---|
char charAt (int index) | 返回给定位置的代码单元。除非对底层的代码单元感兴趣, 否则不需要调用这个方法 |
int codePointAt(int Index) 5.0 | 返回从给定位置开始的码点 |
int offsetByCodePoints(int startlndex, int cpCount) 5.0 | 返回从 startlndex 代码点开始,位移 cpCount 后的码点索引 |
int compareTo(String other) | 按照字典顺序,如果字符串位于 other 之前, 返回一个负数;如果字符串位于 other 之 后,返回一个正数;如果两个字符串相等,返回 0。 |
IntStream codePoints() 8 | 将这个字符串的码点作为一个流返回。调用 toArray 将它们放在一个数组中 |
new String(int[] codePoints, int offset, int count) 5.0 | 用数组中从 offset 开始的 count 个码点构造一个字符串。 |
boolean equals(0bject other) | 如果字符串与 other 相等, 返回 true |
boolean equalsIgnoreCase(String other ) | 如果字符串与 other 相等 ( 忽略大小写,) 返回 true |
boolean startsWith(String prefix ) | 如果字符串以prefix开头则返回 true |
boolean endsWith(String suffix ) | 如果字符串以suffix 结尾则返回 true |
int indexOf(String str) | 返回与字符串 str匹配的第一个子串的开始位置。这个位置从索引 0 开始计算。 如果在原始串中不存在 str,返回 -1 |
int indexOf(String str, int fromlndex ) | 返回与字符串 str 匹配的第一个子串的开始位置。这个位置从fromlndex 开始计算 |
int indexOf(int cp) | 返回与字符串 str 或代码点 cp 匹配的第一个子串的开始位置。这个位置从索引 0 或fromlndex 开始计算 |
int indexOf(int cp, int fromlndex ) | 返回与代码点 cp 匹配的第一个子串的开始位置。这个位置从fromlndex 开始计算 |
int lastIndexOf(String str) | 返回与字符串 str 匹配的最后一个子串的开始位置。 这个位置从原始串尾端开始计算 |
int lastIndexOf(String str, int fromlndex ) | 返回与字符串 str 匹配的最后一个子串的开始位置。 这个位置从 fromlndex 开始计算 |
int lastindexOf(int cp) | 返回与代码点 cp 匹配的最后一个子串的开始位置。 这个位置从原始串尾端开始计算 |
int lastindexOf(int cp, int fromlndex ) | 返回与代码点 cp 匹配的最后一个子串的开始位置。 这个位置 fromlndex 开始计算 |
int length( ) | 返回字符串的长度 |
int codePointCount(int startlndex , int endlndex ) | 返回 startlndex 和 endIndex之间的代码点数量。没有配成对的代用字符将计入代码点 |
String replace( CharSequence oldString,CharSequence newString) | 返回一个新字符串。这个字符串用 newString 代替原始字符串中所有的 oldString |
String substring(int beginlndex ) | 返回一个新字符串。这个字符串包含原始字符串中从 beginlndex 到串尾的所有代码单元。 |
String substring(int beginlndex, int endlndex ) | 返回一个新字符串,这个字符串包含原始字符串中从 beginlndex 到 endlndex-1的所有代码单元。 |
String toLowerCase( ) | 返回一个新字符串, 这个字符串将原始字符串中的大写字母改为小写 |
String toUpperCase( ) | 返回一个新字符串, 这个字符串将原始字符串中的小写字母改成大写字母 |
String trim( ) | 返回一个新字符串。这个字符串将删除原始字符串头部和尾部的空格 |
String join(CharSequence delimiter, CharSequence … elements ) | 返回一个新字符串, 用给定的定界符连接所有元素 |
阅读API文档
正如前面所看到的, String 类包含许多方法。 而且, 在标准库中有几千个类, 方法数量更加惊人。要想记住所有的类和方法是一件不太不可能的事情。 因此,学会使用在线 API 文档十分重要,从中可以查阅到标准类库中的所有类和方法。API文档是 JDK 的一部分, 它是HTML 格式的。就可以看到如图所示的屏幕:
可以看到,屏幕被分成 3个窗框。在左上方的小窗框中显示了可使用的所有包。在它下面稍大的窗框中列出了所有的类。点击任何一个类名之后,这个类的 API 文档就会显示在右侧的大窗框中。例如,要获得有关 String 类方法的更多信息,可以滚动第二个窗框,直到看见 String 链接为止,然后点击这个链接。如下图所示
构建字符串
有些时候, 需要由较短的字符串构建字符串。每次连接字符串, 都会构建一个新的 String 对象,既耗时,又浪费空间。使用 StringBuilder类就可以避免这个问题的发生。可以按照下列步骤进行:
StringBuilder builder =new StringBuilder();
builder.append(ch);
builder.append(str);
String completedString =builder.toString();
下面的API注释包含了StringBuilder类中的重要方法
方法名 | 实现功能 |
---|---|
StringBuilder() | 构造一个空的字符串构建器 |
int length() | 返回构建器或缓冲器中的代码单元数量 |
StringBuilder append(String str) | 追加一个字符串并返回 this |
StringBuilder append(char c) | 追加一个代码单元并返回 this |
StringBuilder appendCodePoint(int cp) | 追加一个代码点,并将其转换为一个或两个代码单元并返回 this。 |
void setCharAt(int i ,char c) | 将第 i 个代码单元设置为 c |
StringBuilder insert(int offset,String str) | 在 offset 位置插入一个字符串并返回 this |
StringBuilder insert(int offset,Char c) | 在 offset 位置插入一个代码单元并返回 this |
StringBuilder delete(int startindex,int endlndex) | 删除偏移量从 startindex 到 endlndex-1 的代码单元并返回 this |
String toString() | 返回一个与构建器或缓冲器内容相同的字符串 |