一、String

字符串创建

public class StringBuild {

    public static void main(String[] args) {

        // 1.直接创建
        String str1 = "abc";
        System.out.println(str1);

        // 2.新建对象创建
        String str2 = new String("abc");
        System.out.println(str2);

        // 3.通过字符数组创建
        char[] crr = new char[]{'a', 'b', 'c'};
        String str3 = new String(crr);
        System.out.println(str3);

        // 4.通过字符数组创建
        byte[] brr = new byte[]{97 ,98 ,99};
        String str4 = new String(brr);
        System.out.println(str4);

    }

}

字符串查找

public class StringFind {

    public static void main(String[] args) { // 字符串查找:str.charAt str.indexOf str.lastIndexOf

        String str = "hello meat ooo";

        // 1 查找指定索引的字符
        System.out.println(str.charAt(4));

        System.out.println("============================================================");

        // 2.1 查找第一次出现指定字符的下标
        System.out.println(str.indexOf('o'));

        // 2.2 从指定索引开始,查找出现指定字符的下标
        System.out.println(str.indexOf('a', 6));

        // 2.3 查找第一次出现指定字符串的第一个元素的下标位置
        System.out.println(str.indexOf("ooo"));

        // 2.4从指定索引开始,查找出现指定字符串的第一个元素的下标位置
        System.out.println(str.indexOf("ooo", 10));

        System.out.println("============================================================");

        // 3.1 从后往前找第一次出现指定字符的下标
        System.out.println(str.lastIndexOf('t'));

        // 3.2 从指定索引开始,从后往前找第一次出现指定字符的下标
        System.out.println(str.lastIndexOf('t', 10));

        // 3.3 从后往前找第一次出现指定字符串的下标
        System.out.println(str.lastIndexOf("ooo"));

        // 3.4 从指定索引开始,从后往前找第一次出现指定字符串的下标
        System.out.println(str.lastIndexOf("ooo", 10));

    }
}

字符串比较

public class StringMethod {

    public static void main(String[] args) {

        String str1 = new String("Hello");
        String str2 = new String("Hello");
        String str3 = new String("World");
        String str4 = str1;

        // 比较引用地址: ==
        System.out.println(str1 == str2);
        System.out.println(str1 == str4);
        System.out.println("============================================================");

        // 比较字符串内容,返回布尔类型:str1.equals(str2)
        System.out.println(str1.equals(str2));
        System.out.println(str1.equals(str4));
        System.out.println("============================================================");

        // 比较内容,返回整型: str1.compareTo(str2)
        System.out.println(str1.compareTo(str2));
        System.out.println(str1.compareTo(str3));
        System.out.println("============================================================");

        // 比较内容,忽略大小写,返回整型:str1.compareToIgnoreCase(str2)
        System.out.println(str1.compareToIgnoreCase(str2));
        System.out.println(str1.compareToIgnoreCase(str3));
        System.out.println("============================================================");
    }
}

字符串替换

public class StringReplace {
    public static void main(String[] args) {
        String str = "Hello meat";

        // 替换全部字符:str.replaceAll
        System.out.println(str.replaceAll("l", "p"));

        // 替换首个字符:str.replaceFirst
        System.out.println(str.replaceFirst("l", "p"));
    }
}

字符串拆分

public class StringSpilt {
    public static void main(String[] args) {

        String str = "Hello World Hello meat";

        // 将字符串全部以空格拆分:str.split("..."),用字符串数组接受
        String[] srr1 = str.split(" ");
        for (String s : srr1) {
            System.out.println(s);
        }
        System.out.println("============================================================");

        // 将字符串以空格拆分 2 次
        String[] srr2 = str.split(" ", 2);
        for (String s : srr2) {
            System.out.println(s);
        }
        System.out.println("============================================================");

        // . | * + ,  ==> 都需要\\转义才能拆分
        String str2 = "name=ZhangSan&age=18";
        String[] srr3 = str2.split("=|&");
        for (String s : srr3) {
            System.out.println(s);
        }
    }
}

字符串的截取和去除空格

public class SubStringAndTrim {
    public static void main(String[] args) { // 字符串的截取和去除空格
        String str1 = "hello meat";

        // 从指定索引截取到结尾:str.substring(index)
        System.out.println(str1.substring(5));

        // 截取指定索引范围内内容:str.substring(index, index)
        System.out.println(str1.substring(5, 8));
        System.out.println("============================================================");

        String str2 = "  hello world";

        //去除两边的空格:str.trim()
        System.out.println(str2);
        System.out.println(str2.trim());
    }
}

intern方法

public class StringIntern {
    public static void main(String[] args) {

        char[] ch = new char[]{'a', 'b', 'c'};
        String str1 = new String(ch);

        str1.intern(); // 调用此方法后,将str1对象的引用放入字符串常量池中

        String str2 = "abc"; // “abc” 在字符串常量池中已经存在,str2创建时之间使用"abc"的引用

        System.out.println(str1 == str2); // 返回true,若没有调用上述方法则返回false

    }
}

字符串转换

public class StringTransfer {

    public static void main(String[] args) {

        // 转换为字符串形式
        String s1 = String.valueOf(1); // 整型转换为字符串:String.valueOf(...)
        String s2 = String.valueOf(1.1); // 浮点转换为字符串:String.valueOf(...)
        String s3 = String.valueOf(true); // 布尔转换为字符串:String.valueOf(...)
        String s4 = String.valueOf(new Student("LiHua", 18)); // 打印类的信息
        System.out.println(s1 + "   " + s2 + "   " + s3 + "   " + s4);
        System.out.println("============================================================");

        // 字符串转为数字:封装类型.parse类型("...") 以此类推
        int a = Integer.parseInt("1"); // 字符串转为整型
        double b = Double.parseDouble("1.1"); // 字符串转为浮点
        System.out.println(a);
        System.out.println(b);
        System.out.println("============================================================");

        // 大小写转换:str.toUpperCase() str.toLowerCase()
        String str1 = "Hello";
        String str2 = "HELLO";

        System.out.println(str1.toUpperCase()); // 小写转大写
        System.out.println(str2.toLowerCase()); // 大写转小写
        System.out.println("============================================================");

        // 字符串转为字符数组:str.toCharArray()
        String str3 = "Hello";
        char[] ch = str3.toCharArray();
        for (char c : ch) {
            System.out.print(c + " ");
        }
        System.out.println();
        System.out.println("============================================================");

        // 字符数组转为字符串:String str = new String(定义好的字符数组变量)
        String str4 = new String(ch);
        System.out.println(str4);
        System.out.println("============================================================");

        // 格式化输出:String.format(" ", ...)
        String str5 = String.format("%d,%d,%d", 2020,1,1);
        System.out.println(str5);
    }
}

重写toString方法

class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

二、StringBuffer和StringBuilder

由于String的内容无法修改,StringBuffer和StringBuilder解决了这一问题,可用于频繁修改字符串的操作,两者的方法区别不大。其中StringBuffer有线程安全,而StringBuilder没有。

注:

  1. StringBuffer和StringBuilder不能和String直接转换。
  2. String转换StringBuffer和StringBuilder:调用构造方法或append()方法。
  3. StringBuffer和StringBuilder转换String:调用toString()方法。
  4. StringBuffer和StringBuilder的方法声明有区别。
public static StringBuilder append(String s) {
    StringBuilder sb = new StringBuilder();
    sb.append(s);
    return sb;
}

public static synchronized StringBuffer append(String s) {
    StringBuffer sb = new StringBuffer();
    sb.append(s);
    return sb;
}

StringBuilder常用方法

public static void main(String[] args) {

    StringBuilder sb1 = new StringBuilder("hello");
    StringBuilder sb2 = sb1;
    
    sb1.append(" "); // 字符串尾插
    sb1.append("meat");
    System.out.println(sb1 == sb2); // true
    System.out.println(sb1.charAt(0)); // 获取下标为0的字符
    System.out.println(sb1.length()); // 获取字符串长度
    System.out.println(sb1.capacity()); // 获取字符串底层数组长度
    sb1.setCharAt(0, 'H'); // 修改下标为0的字符为'H'
    sb1.insert(0, "Wow") // 在下标为0的地方插入字符串
    System.out.println(sb1.indexOf("hello")); // 输出第一次出现指定字符的位置
    System.out.println(sb1.lastIndexOf("hello")); // 输出最后一次出现指定字符的位置
    sb1.deleteCharAt(0); // 删除指定下标的字符
    sb1.deletet(0, 2); // 删除[0, 2)范围内的字符
    String str1 = sb1.substring(0, 2); // 截取[0, 2)范围内的字符并以String返回
    String str2 = sb1.toString(); // 以String返回
    sb1.reverse(); // 翻转字符串
}