亲宝软件园·资讯

展开

Java 字符串简介

编程我的一切 人气:0

从概念上讲,Java 字符串就是 Unicode 字符序列。Java 没有内置的字符串类型,而是在标准 Java 类库中提供了一个预定义类,很自然地叫做 String。每个用双引号括起来的字符串都是 String 类的一个实例:

String e = ""; // 空字符串
String greeting = "Hello";

1. 子串

String 类的 substring 方法可以从一个较大的字符串提取出一个子串。

String greeting = "Hello";
String s = greeting.substring(0, 3); // 变量 s 为 "Hel"

字符串中的代码单元和代码点从 0 开始计算。substring 方法的第二个参数是不想复制的第一个位置。

substring 的工作方式有一个优点: 容易计算子串长度。字符串s.substring(a, b)的长度为b - a

2. 拼接

Java 语言允许使用 + 号连接(拼接)两个字符串。

String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;
System.out.println(message);        // 打印 Expletivedeleted

当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。

如果需要把多个字符串放在一起,用一个界定符分隔,可以使用静态 join 方法:

String all = String.join(" /", "S", "M", "L", "XL");
System.out.println(all);// 打印 S /M /L /XL

String [] arr = {"S", "M", "L", "XL"};
all = String.join(" /", arr);
System.out.println(all);// 打印 S /M /L /XL

arr = new String[]{"S", "M", "L", "XL"};
List<String> list = Arrays.asList(arr);
all = String.join(" /", arr);
System.out.println(all);// 打印 S /M /L /XL

3. 字符串不可变

String 类没有提供用于修改字符串的方法。由于不能修改 Java 字符串,所以在 Java 文档中将 String 类对象称为是不可变的(immutable)。不可变字符串却有一个优点:编译器可以让字符串共享。

Java 的设计者认为共享带来的高效率远远胜过于提取子串、拼接字符串所带来的低效率。查看一下程序会发现:很少需要修改字符串,而是往往需要对字符串进行比较(有一种例外情况,将来自于文件或键盘的单个字符或较短的字符串汇集成字符串),Java 专门为此提供了一个单独的类。

4. 检测字符串是否相等

可以使用 equals 方法检测两个字符串是否相等。表达式:

s.equals(t);

如果字符串 s 与字符串 t 相等,返回 true;否则,返回 false。s 与 t 可以是字符串变量,也可以是字符串字面量。

想要检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。

"Hello".equalsIgnoreCase("hello"); // true

一定不要使用 == 运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上。当然,如果字符串放置在同一个位置上,她们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。

如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符检测是否相等。但实际上只有字符串常量是共享的。而 + 或 substring 等操作产生的结果并不是共享的。因此,千万不要使用 == 运算符测试字符串的相等性,以免在程序中出现糟糕的 bug。这种 bug 很像随机产生的间歇性错误。

5. 空串与 Null 串

空串是一个 Java 对象,有自己的长度(0)和内容(空)。空串 “” 是长度为 0 的字符串。

代码检查一个字符串是否为空:

if (str.length() == 0)
// 或
if (str.equals(""))

要检查一个字符串是否为 null:

if (str == null)

检查一个字符串既不是 null 也不为空串:

if (str != null && str.length() != 0)

6. 码点与代码单元

Java 字符串由 char 值序列组成。char 数据类型是一个采用 UTF-16 编码表示 Unicode 码点的代码单元。最常用 Unicode 字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。

length 方法将返回采用 UTF-16 编码表示的给定字符所需要的代码单元数量。

String greeting = "Hello";
int n = greeting.length(); // 变量 n 为 5

要想得到实际的长度,即码点数量,可调用:

String greeting = "Hello";
int n = greeting.codePointCount(0, greeting.length()); // 变量 n 为 5

调用 s.charAt(n) 将返回位置 n 的代码单元,n 介于0 ~ s.length()-1之间。

String greeting = "Hello";
char first = greeting.charAt(0); // first 为 'H'
char last = greeting.charAt(4); // last 为 'o'

要想得到第 i 个代码点,应该使用下列语句

String greeting = "Hello";
int i = 3;

int index = greeting.offsetByCodePoints(0, i);
int cp = greeting.codePointAt(index);
// 或者
int cp = greeting.codePointAt(index);

Java 对字符串中的代码单元和码点从 0 开始。

为什么对代码单元如此大惊小怪?考虑下列语句:

加载全部内容

相关教程
猜你喜欢
用户评论