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 一节.

其他字符串方法

其他字符串的详细方法请参照手册, 以下是一个快速列表:

方法 描述
charAt(int index)
返回指定索引上的 char 值.
codePointAt(int index)
返回指定索引上的字符(Unicode 代码号).
codePointBefore(int index)
返回指定索引前的字符(Unicode 代码号).
codePointCount(int beginIndex, int endIndex)
返回String在指定文本范围内的Unicode代码号的数量(int).
compareTo(String anotherString)
按字典顺序比较两个字符串, 返回 int
compareToIgnoreCase(String str)
忽略大小写按字典顺序比较两个字符串, 返回 int
concat(String str)
返回将指定字符串拼接到当前字符串的结尾的String.
contains(CharSequence s)
仅当当前字符串返回指定序列时返回true.
contentEquals(CharSequence cs)
比较当前字符串是否等同于指定的CharSequence(字符序列).
contentEquals(StringBuffer sb)
比较当前字符串是否等同于指定的StringBuffer(字符串缓存).
copyValueOf(char[] data)
返回表示指定数组中字符序列的String.
copyValueOf(char[] data, int offset, int count)
返回一个String, 它表示指定字符数组中的范围.
endsWith(String suffix)
检测字符串是否以指定的后缀结尾.
equals(Object anObject)
将字符串与指定对象比较, 返回boolean.
equalsIgnoreCase(String anotherString)
忽略大小写将字符串与指定字符串比较, 返回boolean.
format(Locale l, String format,Object... args)
使用指定的语言环境, 格式字符串和参数, 返回格式化的String
format(String format, Object... args)
使用指定格式字符串和参数, 返回格式化的String
getBytes()
使用平台的默认字符集将字符串编码为字节序列,并将结果存储到新的byte[]中。
getBytes(Charset charset)
使用给定的字符集, 将此字符串编码为字节序列, 并将结果存储到一个新字节中.
getBytes(String charsetName)
使用命名的字符集将字符串编码为字节序列,并将结果存储到新的字节数组中。
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符串中的字符复制到目标字符数组中.
hashCode()
返回此字符串的哈希码
indexOf(int ch)
返回指定字符首次出现在此字符串中的索引.
indexOf(int ch, int fromIndex)
返回指定字符首次出现在该字符串中从指定索引开始搜索的索引.
indexOf(String str)
返回首次在此字符串内出现的指定子字符串的索引.
indexOf(String str, int fromIndex)
从指定的索引开始,返回指定子字符串首次出现时在此字符串内的索引。
intern()
返回字符串对象的规范表示形式.
isEmpty()
当且仅当length()的返回值为0时为true.
lastIndexOf(int ch)
返回指定字符最后一次出现在此字符串中的索引.
lastIndexOf(int ch, int fromIndex)
返回字符串从指定索引处开始向后搜索的最后一次出现的指定字符所在的索引.
lastIndexOf(String str)
返回字符串中最后一次出现的指定子字符串的索引.
lastIndexOf(String str, int fromIndex)
返回字符串从指定索引处开始向后搜索的最后一次出现的指定字符串所在的索引.
length()
返回字符串的长度.
matches(String regex)
判断此字符串是否与给定的Pattern(正则表达式)匹配.
offsetByCodePoints(int index, int codePointOffset)
返回字符串中的索引,该索引相对于给定的索引偏移了指定代码点数的代码点。
regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等.
regionMatches(int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等.
replace(char oldChar, char newChar)
返回一个新字符串, 该字符串是用newChar替换了字符串中所有出现的oldChar的结果.
replace(CharSequence target, CharSequence replacement)
用指定的 文字替换序列 替换字符串中匹配 文字目标序列 的每个子字符串.
replaceAll(String regex, String replacement)
用给定的替换项替换掉字符串中匹配正则表达式的每个子字符串.
replaceFirst(String regex, String replacement)
用给定的替换项替换掉字符串中匹配正则表达式的首个子字符串.
split(String regex)
用给定的正则表达式拆分字符串成String[].
split(String regex, int limit)
用给定的正则表达式拆分字符串成指定个数的String[].
startsWith(String prefix)
测试字符串是否以指定的前缀开头.
startsWith(String prefix, int toffset)
测试字符串从指定的索引开始的子字符串是否以指定的前缀开头
strip()
返回值为删除了所有前置与尾随空格的字符串.
stripLeading()
返回值为删除了所有前置空格的字符串.
stripTrailing()
返回值为删除了所有尾随空格的字符串.
subSequence(int beginIndex, int endIndex)
返回一个字符串指定范围的子字符序列.
substring(int beginIndex)
返回从字符串指定位置开始的子字符串.
substring(int beginIndex, int endIndex)
返回从字符串指定区间的子字符串.
toCharArray()
将字符串转换为新的字符数组.
toLowerCase()
使用默认语言环境的规则将字符串中的所有字符转换为小写.
toLowerCase(Locale locale)
使用指定语言环境的规则将字符串中的所有字符转换为小写.
toString()
返回字符串对象的字符串(这本就是个字符串).
toUpperCase()
使用默认语言环境的规则将字符串中的所有字符转换为大写.
toUpperCase(Locale locale)
使用指定语言环境的规则将字符串中的所有字符转换为大写.
trim()
返回了去除了前后空格的String的副本
valueOf(x)
将其他类型的参数表示成String, x 可用的类型有(boolean, char, char[], double, float, int, long, Object).

更详细的内容请参见 Java String 参考手册

以上就是 Java 字符串的全部内容, 下一节请看: Java 中的数组