在Java中,字符和字符串是两个不同的类型。

字符类型char是基本数据类型,一个char保存一个Unicode字符,Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可

int n1 = 'A'; // 字母“A”的Unicodde编码是65
int n2 = '中'; // 汉字“中”的Unicode编码是20013

和char类型不同,字符串类型String是引用类型,我们用双引号"..."表示字符串。一个字符串可以存储0个到任意个字符。

1、基本用法

展示基本用法,看几句代码就OK了

package com.practice;

import java.util.Arrays;

public class StringPractice {
    public static void main(String[] args) {
        // 字符串创建,不推荐
        String string = new String("java is the best language in the world");
        // 直接这样
        String string = "java is the best language in the world";
        // 字符串长度
        System.out.printf("字符串长度为%d\n", string.length());
        // 获取类型
        System.out.println(string.getClass().getName());
        // 遍历字符串,注意字符串遍历出来是字符类型
        for (int i = 0; i < string.length(); i += 5) {
            System.out.println(string.charAt(i));
        }
        // 字符串索引
        System.out.println(string.indexOf("best"));
        // 字符串是否包含某个子串
        System.out.println(string.contains("java"));
        // 字符串转化大写
        System.out.println(string.toUpperCase());
        // 字符串截取,左开右闭
        System.out.println(string.substring(8, 13));
        // 字符串分割,会分割成数组
        String[] s = string.split(" ");
        System.out.println(Arrays.toString(s));
        // 用字符串拼接数组,是字符串方法
        System.out.println(String.join("+", s));
        // 和char转换,会把字符串转化为字符数组
        char[] ch = string.toCharArray();
        System.out.println(ch);
        // 字符串替换
        System.out.println(string.replace("best", "worst"));

    }
}

字符串拼接多说一嘴,+号拼接:

String a = "aaa" + "bbb";

字符串方法拼接:

String a = "aaa".concat("bbb");

2、StringBuilder类

但是当我们字符串拼接的东西过多时,可以使用StringBuilder类,高效拼接。
append用来追加、insert用来插入

StringBuilder类还有其他方法,可以自行查询

StringBuilder sb = new StringBuilder(string);
        sb.append(" hahaha")
                .append(" hahaha")
                .append(" aaa")
                .insert(0, "my");
        System.out.println(sb.toString());

你可能还听说过StringBuffer,这是Java早期的一个StringBuilder的线程安全版本,它通过同步来保证多个线程操作StringBuffer也是安全的,但是同步会带来执行速度的下降。

StringBuilder和StringBuffer接口完全相同,现在完全没有必要使用StringBuffer。

3、字符串比较

当我们想要比较两个字符串是否相同时,要特别注意,我们实际上是想比较字符串的内容是否相同。必须使用equals()方法而不能用==。

public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1 == s2);   // false
        System.out.println(s1.equals(s2));   //true
    }
}

两个字符串比较,必须总是使用equals()方法。

要忽略大小写比较,使用equalsIgnoreCase()方法。

4、其他方法

"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
"  \tHello\r\n ".trim(); // "Hello",用来去除首尾空白字符

另一个strip()方法也可以移除字符串首尾空白字符。它和trim()不同的是,类似中文的空格字符\u3000也会被移除:

"\u3000Hello\u3000".strip(); // "Hello"

String还提供了isEmpty()和isBlank()来判断字符串是否为空和空白字符串:

"".isEmpty(); // true,因为字符串长度为0
"  ".isEmpty(); // false,因为字符串长度不为0
"  \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符

5、格式化字符串

字符串提供了formatted()方法和format()静态方法,可以传入其他参数,替换占位符,然后生成新的字符串:

public class Main {
    public static void main(String[] args) {
        String s = "Hi %s, your score is %d!";
        System.out.println(s.formatted("Alice", 80));
        System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5));
    }
}

不知道什么,用%s占位总OK的

String.format("Hi %s, your score is %s!", "Bob", 59.5)

6、类型转换

其他类型转字符串,用String.valueOf()

String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@6

字符串转化为其他类型:

int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255

把字符串转换为boolean类型:

boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false

字符串和字符互转:

char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String

最后,字符串是不可变对象