Java String 类
String 类用于表示字符的联. 是大多变成语言中都非常常见的一种类型, 毕竟信息的主要载体还是字符啊.
Java程序中字符串是一种常量, 所有的字符串文字例如 "21yi.com", 都实现为 String 类的实例.
字符串的值在创建后无法变更. 如果修改字符串, 请参见 StringBuffer 一节. 由于String对象是不可变的, 因此可以共享它们.
创建字符串对象
我们可以将字符串常量直接赋值给一个变量, 例如:
String str = "21yi.com";
这相当于
char site[] = {'2', '1', 'y', 'i', '.', 'c', 'o', 'm'}; String str = new String(site);
我们同样还可以使用以下的方式来创建一个字符串:
String China = new String("中国"); String oneHundredStr = String.valueOf(100);
字符串的比较
通过上面我们大概了解到, 将常量字符串赋值给字符串是创建字符串对象的一种方式, 同时我们也可以通过 new String() 的方式来初始化一个字符串对象来创建. 但是需要注意的是, 虽然两个种方式创建的字符串的内容一致, 但经过前面我们也知道, Java 中变量是对地址引用的一种符号, 同时比较符 == 是判断变量地址是否一致的符号, 因此使用 == 来判断字符串的值是否相等是不准确的, 需要通过 String.equals(String str) 来判断两个字符串的值是否相等.
代码示例如下:
package com.yi21.string; public class StringDemo { public static String getId(String str) { return str.hashCode() + " | " + System.identityHashCode(str); } public static void main(String[] args) { String str = "21Yi"; String str2 = str; String str3 = new String("21Yi"); String str4 = new String("21Yi"); System.out.println(" str ID: " + getId(str)); System.out.println(" str2 ID: " + getId(str2)); System.out.println("str == str2: " + (str == str2)); System.out.println(" str3 ID: " + getId(str3)); System.out.println(" str4 ID: " + getId(str4)); System.out.println("str2 == str3: " + (str2 == str3)); System.out.println("str2 == str4: " + (str2 == str4)); System.out.println("str3 == str4: " + (str3 == str4)); System.out.println("str3 eq str4: " + str3.equals(str4)); System.out.println("str3 eq str : " + str3.equals(str)); } }
上述代码中我们使用了 String.hashCode 和 System.identityHashCode 的这两个方法, 前者用于返回字符串值的Hash代码(不同的类实现的方式不一样, String中是这样实现的), 而后者用于返回物理内存地址产生的hash值代码, 其代表的是物理地址的值, 并不是实际的物理的值. 然后我们分别使用了 == 和 String.equals(String str) 来比较, 结果如下(具体的 hashCode 和 identityHashCode 的值以自己运行为准):
str ID: 1539503 | 1940030785 str2 ID: 1539503 | 1940030785 str == str2: true str3 ID: 1539503 | 1869997857 str4 ID: 1539503 | 1763847188 str2 == str3: false str2 == str4: false str3 == str4: false str3 eq str4: true str3 eq str : true
由上我们看出 hashCode 因为字符串的值一致, 所以总是返回 1539503, 而其实际的地址引用却是不同的, 由此我们可以知道 == 可以判断两个变量是否引用的是同一个地址, 而 String.equals(String str) 是通过 hashCode 来判断两个字符串变量的值是否相同的.
常见的字符串用法
字符串作为一个常见的字符载体, 处理起来总是有很多需求的, 下面我们就来看看一些常见的字符串的用法.
获取字符串长度
通过字符串的 length() 方法, 我们可以获得一个字符串的长度, 定义如下:
int String.length()
示例如下:
String str = "21Yi教程"; System.out.println(str.length());
这段代码的执行结果显示, 这个字符串长度为6 (分别是: 2, 1, Y, i, 教, 程 这6个字)
大小写的转换
通过字符串的 toUpperCase() 和 toLowerCase() 方法, 我们可以分别将一个字符转转换成大写或小写, 定义如下:
String String.toUpperCase()
String String.toLowerCase()
示例如下:
String str = "AbCdE";
System.out.println(str.toUpperCase()); System.out.println(str.toLowerCase());
输出结果为:
ABCDE abcde
拼接字符串
通过 + 或者字符串的 contract() 方法, 我们可以实现字符串的拼接, 定义如下:
String String.contract(String str)
示例如下:
String str = "AbCdE"; System.out.println(str.concat("fG")); System.out.println(str + "fG");
输出结果为:
AbCdEfG AbCdEfG
格式化输出字符串
在编写代码的时候, 我们有时候想输出的不一定只有字符串, 可能还混有其他类型, 比如数字.如果一直使用 + 拼接, 效果可能不是很好, 而且有的类型, 比如小数我们可能希望输出有效数字的位数是可控的. 这个时候我们就需要用到, 格式化输出了. 详情请看: String.format() 的详解
字符串的修改
在Java中, 如果我们希望修改一个字符串的值得, 我们不建议使用 String 来进行字符串的反复修改, 因为个过程会反复创建新的 String 变量, 这是一种浪费行为, 我们建议使用的是 StringBuffer 来操作字符串的修改, 详情参见请参见 StringBuffer 一节.
其他字符串方法
其他字符串的详细方法请参照手册, 以下是一个快速列表:
序号 | 类型 | 名称 | 说明 |
---|---|---|---|
1 | 方法 | String.valueOf() |
取各种类型(包括基础类型)的 |
2 | 方法 | String.trim() |
去除字符串首尾空格字符 |
3 | 方法 | String.toUpperCase() |
将字符串的所有字母转换成大写 |
4 | 方法 | String.toString() |
返回字符串自身 |
5 | 方法 | String.toLowerCase() |
将字符串的所有字母转换成小写 |
6 | 方法 | String.toCharArray() |
将字符串转换成字符数组 |
7 | 方法 | String.substring() |
从字符串截取一个字符串 |
8 | 方法 | String.subSequence() |
从字符串截取一个字符序列 |
9 | 方法 | String.startsWith() |
判断字符串的开始字符 |
10 | 方法 | String.split() |
分割字符串 |
11 | 方法 | String.replaceFirst() |
替换字符串中首次匹配正则表达式的字符串为指定字符串 |
12 | 方法 | String.replaceAll() |
替换字符串中匹配正则表达式的字符串为指定字符串 |
13 | 方法 | String.replace() |
替换字符串中的指定的字符或字符串 |
14 | 方法 | String.regionMatches() |
测试两个字符串区域(region)是否相等. |
15 | 方法 | String.offsetByCodePoints() |
计算在给定索引下偏移一定的代码点(code point)所得到的索引. |
16 | 方法 | String.matches() |
是否匹配正则表达式 |
17 | 方法 | String.length() |
字符串长度 |
18 | 方法 | String.lastIndexOf() |
返回字符串或字符最后次出现的索引 |
19 | 方法 | String.join() |
拼接字符串 |
20 | 方法 | String.isEmpty() |
字符串是否为空 |
21 | 方法 | String.isBlank() |
字符串是否为空空格, Java 11 中新增的方法 |
22 | 方法 | String.intern() |
返回规范表示的字符串. |
23 | 方法 | String.indexOf() |
返回字符串或字符首次出现的索引 |
24 | 方法 | String.hashCode() |
返回对象的哈希值. |
25 | 方法 | String.getChars() |
复制字符串字符到字符数组 |
26 | 方法 | String.getBytes() |
获取字符串的字符集数组 |
27 | 方法 | String.equalsIgnoreCase() |
判断字符串是否与目标字符串在忽略大小写时相等 |
28 | 方法 | String.equals() |
判断字符串是否与目标相等 |
29 | 方法 | String.endsWith() |
判断字符串的结束字符 |
30 | 方法 | String.copyValueOf() |
复制字符数组的值 |
31 | 方法 | String.contentEquals() |
与 |
32 | 方法 | String.contains() |
是否包含指定字符串. |
33 | 方法 | String.concat() |
在尾部拼接一个字符串 |
34 | 方法 | String.compareToIgnoreCase() |
按字典顺序比较字符串, 忽略大小写差异. |
35 | 方法 | String.compareTo() |
按字典顺序比较字符串. |
36 | 方法 | String.codePointCount() |
求范围内代码点的数量 |
37 | 方法 | String.codePointBefore() |
获取索引位置前的代码点. 相当于使用 |
38 | 方法 | String.codePointAt() |
计算索引位置的代码点(Code Point) |
39 | 方法 | String.charAt() |
计算指定索引的字符 |
40 | 方法 | String() |
|
41 | 方法 | String.format() |
在编写代码的时候, 我们有时候想输出的不一定只有字符串, 可能还混有其他类型, 比如数字.如果一直使用 + 拼接, 效果可能不是很好, 而且有的类型, 比如小数我们可能希望输出有效数字的位数是可控的. 这个时候我们就需要用到
|
更详细的内容请参见 Java String 参考手册以上就是 Java 字符串的全部内容, 下一节请看: Java 中的数组