public class str {
    public static void main(String[] args) {
        // 创建字符串的常用方式
        // 创建位置是在公共池,即s1 == s2 == s3
        String s1 = "Hello"; // String 直接创建
        String s2 = "Hello"; // String 直接创建
        String s3 = s1; // 相同引用

        // 创建位置是在堆,即s4 != s5
        String s4 = new String("Hello"); // String 对象创建
        String s5 = new String("Hello"); // String 对象创建
        // 使用字符数组创建
        char[] charArray = { 'H', 'e', 'l', 'l', 'o' };
        String s6 = new String(charArray);

        // 常用方法
        // 1.返回字符串长度
        System.out.println(s1.length());
        // 2.链接两个字符串,两种方式
        System.out.println(s1.concat(s2));
        System.out.println(s1 + s2);
        // 3.返回指定索引处的 char 值。
        System.out.println(s1.charAt(2));
        // 4.把这个字符串和另一个对象从左往右比较。
        // 返回的是第一个不同字符的ASCII码的差值(比较-被比较),这里返回-4
        System.out.println("123".compareTo("165"));
        // 5.把这个字符串和另一个对象从左往右比较,忽略大小写。
        // 返回的是第一个不同字符的ASCII码的差值(比较-被比较),这里返回-4
        System.out.println("1a23".compareToIgnoreCase("1A65"));
        // 6.当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真.
        // 相对比较,使用equals更多
        StringBuffer sb = new StringBuffer("1a23");
        System.out.println("1a23".contentEquals("1a23"));
        // 7.返回指定*数组*中表示该字符序列的 String。 即截取操作
        char[] Str1 = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!' };
        String Str2 = "";
        Str2 = Str2.copyValueOf(Str1); // 截取全部
        System.out.println("返回结果:" + Str2);
        Str2 = Str2.copyValueOf(Str1, 2, 7);
        System.out.println("返回结果:" + Str2);
        // 8.测试此字符串是否以指定的后缀结束。
        System.out.println(s4.endsWith("llo"));
        // 9.将此 String 与另一个 String 比较,不考虑大小写。
        System.out.println("hello".equalsIgnoreCase("HELLO"));
        // 10.返回指定字符在此字符串中第一次出现处的索引。
        System.out.println("Hello".indexOf('l'));
        // 11.返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
        System.out.println("hello world".indexOf('l', 4));
        // 12.返回指定子字符串在此字符串中第一次出现处的索引。
        System.out.println("hello world".indexOf("wor"));
        // 13.返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
        System.out.println("hello world".indexOf("wor", 3));
        // 14. 返回指定字符在此字符串中最后一次出现处的索引。
        System.out.println("hello world".lastIndexOf('l'));
        // 15.返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。
        System.out.println("hello world".lastIndexOf('l', 4));
        // 16.返回指定子字符串在此字符串中最右边出现处的索引。
        System.out.println("hello worlld".lastIndexOf("ll"));
        // 17.返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
        System.out.println("hello worlld".lastIndexOf("ll", 3));
        // 18.告知此字符串是否匹配给定的正则表达式。也可以查是否包含要查找的子串
        System.out.println("hello world".matches("(.*)wor(.*)"));
        // 19.测试两个字符串区域是否相等。
        /**
         * public boolean regionMatches(boolean ignoreCase, int toffset, String other,
         * int ooffset, int len) 参数 ignoreCase -- 如果为 true,则比较字符时忽略大小写。默认为false toffset
         * -- 此字符串中子区域的起始偏移量。 other -- 字符串参数。 ooffset -- 字符串参数中子区域的起始偏移量。 len --
         * 要比较的字符数。
         */
        System.out.println("hellohellohello".regionMatches(true, 5, "hello", 0, 5));
        // 20.返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
        System.out.println("*****".replace("*", "+"));
        // 21.replaceAll() 方法使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。
        /**
         * public String replaceAll(String regex, String replacement) regex --
         * 匹配此字符串的正则表达式。 newChar -- 用来替换每个匹配项的字符串。 成功则返回替换的字符串,失败则返回原始字符串。
         */
        System.out.println("hello world".replaceAll("(.*)world(.*)", "nice!!"));
        // 22.replaceFirst() 方法使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
        /**
         * public String replaceFirst(String regex, String replacement) regex --
         * 匹配此字符串的正则表达式。 replacement -- 用来替换第一个匹配项的字符串。 成功则返回替换的字符串,失败则返回原始字符串。
         */
        System.out.println("hello world".replaceFirst("(.*)world(.*)", "nice!!"));
        // 23.split() 方法根据匹配给定的正则表达式来拆分字符串。
        // public String[] split(String regex, int limit)
        /**
         * regex -- 正则表达式分隔符。 limit -- 分割的份数。 返回值:字符串数组。
         */
        System.out.println("hello - hello - world".split("-", 2));
        // 24.测试此字符串是否以指定的前缀开始。
        System.out.println("dehello".startsWith("de"));
        // 25.测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
        System.out.println("0123dehello".startsWith("de", 3));
        // 26.subSequence() 方法返回一个新的字符序列,它是此序列的一个子序列。
        // public CharSequence subSequence(int beginIndex, int endIndex)
        // 相同的方法还有:
        // String substring(int beginIndex)
        // String substring(int beginIndex, int endIndex)
        /**
         * 截取操作 参数: beginIndex -- 起始索引(包括)。 endIndex -- 结束索引(不包括)。 返回值:返回截取的部分
         */
        System.out.println("0123hello9".subSequence(4, 9));
        // 27.将此字符串转换为一个新的字符数组。
        System.out.println("hello".toCharArray());
        // 28.使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
        // String toLowerCase()
        // 29. 返回此对象本身(它已经是一个字符串!)。
        // String toString()
        // 30.使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
        // String toUpperCase()
        // 31.返回字符串的*副本*,忽略前导空白和尾部空白。
        // String trim()
        // 32.返回给定data type类型x参数的字符串表示形式。
        /**
         * valueOf(boolean b): 返回 boolean 参数的字符串表示形式。. valueOf(char c): 返回 char
         * 参数的字符串表示形式。 valueOf(char[] data): 返回 char 数组参数的字符串表示形式。 valueOf(char[] data,
         * int offset, int count): 返回 char 数组参数的特定子数组的字符串表示形式。 valueOf(double d): 返回
         * double 参数的字符串表示形式。 valueOf(float f): 返回 float 参数的字符串表示形式。 valueOf(int i): 返回
         * int 参数的字符串表示形式。 valueOf(long l): 返回 long 参数的字符串表示形式。 valueOf(Object obj): 返回
         * Object 参数的字符串表示形式。
         */
        // 33.contains() 方法用于判断字符串中是否包含指定的字符或字符串。
        // public boolean contains(CharSequence chars)
        System.out.println("hello world".contains("o w"));
        // 34.判断字符串是否为空。
        // isEmpty()
    }
}