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.hashCodeSystem.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()

取各种类型(包括基础类型)的 String

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()

CharSequence 进行比较

32 方法 String.contains()

是否包含指定字符串.

33 方法 String.concat()

在尾部拼接一个字符串

34 方法 String.compareToIgnoreCase()

按字典顺序比较字符串, 忽略大小写差异.

35 方法 String.compareTo()

按字典顺序比较字符串.

36 方法 String.codePointCount()

求范围内代码点的数量

37 方法 String.codePointBefore()

获取索引位置的代码点. 相当于使用 1 作为索引的开始来操作字符串.

38 方法 String.codePointAt()

计算索引位置的代码点(Code Point)

39 方法 String.charAt()

计算指定索引的字符

40 方法 String()

String 的构造函数, 具体参照示例.

41 方法 String.format()

在编写代码的时候, 我们有时候想输出的不一定只有字符串, 可能还混有其他类型, 比如数字.如果一直使用 + 拼接, 效果可能不是很好, 而且有的类型, 比如小数我们可能希望输出有效数字的位数是可控的. 这个时候我们就需要用到 String.format 来简化这一流程了.

String.format 还可以通过提供 Locale 类的语言环境参数, 确定语言环境, 如果不提供 Locale 参数则 String.format 方法会通过 Locale.getDefault() 方法获取当前默认的语言环境作为参数.

更详细的内容请参见 Java String 参考手册以上就是 Java 字符串的全部内容, 下一节请看: Java 中的数组