20-String和编码

StringJava的String和char在内存中总是以Unicode编码表示。
在Java中,String是一个引用类型,它本身也是一个class。Java编译器对String有特殊处理,即可以直接用"..."来表示一个字符串,字符串在String内部是通过一个char[]数组表示的。Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]字段,以及没有任何修改char[]的方法实现的。
String s1 = "Hello!";
String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});

字符串比较
当我们想要比较两个字符串是否相同时,必须使用equals()方法而不能用==,要忽略大小写比较,使用equalsIgnoreCase()方法。
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}

String类中搜索子串
// 是否包含子串:
"Hello".contains("ll"); // true

注意:contains()方法的参数是CharSequence(字符序列)而不是String,因为CharSequence是String的父类。

方法名称
描述
public boolean contains(String str)
判断指定内容是否存在
public int indexOf(String str)
由前向后查找指定字符串位置,如果超找到了则返回(第一个字母)位置索引,如果找不到返回-1
public int indexOf(String str,int fromIndex)
由指定位置从前向后查找指定字符串的位置,找不到返回-1
public int lastIndexOf(String str)
由后向前查找字符串位置,找不到返回-1
public int lastIndexOf(String str,int fromIndex)
从指定位置由后向前查找字符串位置,找不到返回-1
public boolean startsWith(String prefix)
判断是否以指定的字符开头
public boolean startsWith(String prefix,int toffset)
从指定位置开始判断是否以指定的字符开头
public boolean endWith(String suffix)
判断是否以指定的字符串结尾


提取子串https:
//www.cnblogs.com/zhangfei/p/5092220.html public String substring(int beginIndex) public String substring(int beginIndex, int endIndex) 参数 beginIndex -- 起始索引(包括), 索引从 0 开始。 endIndex -- 结束索引(不包括)。 "Hello".substring(2); // "llo" "Hello".substring(2, 4);// "ll" 去除首尾空白字符 使用trim()方法可以移除字符串首尾空白字符。空白字符包括空格,\t,\r,\n: " \tHello\r\n ".trim(); // "Hello"//trim()并没有改变字符串的内容,而是返回了一个新字符串。 另一个strip()方法也可以移除字符串首尾空白字符。它和trim()不同的是,类似中文的空格字符\u3000也会被移除: "\u3000Hello\u3000".strip(); // "Hello" " Hello ".stripLeading(); // "Hello " 前面 " Hello ".stripTrailing(); // " Hello"后面 String还提供了isEmpty()和isBlank()来判断字符串是否为空和空白字符串: "".isEmpty(); // true,因为字符串长度为0 " ".isEmpty(); // false,因为字符串长度不为0 " \n".isBlank(); // true,因为只包含空白字符 " Hello ".isBlank(); // false,因为包含非空白字符 替换子串 要在字符串中替换子串,有两种方法。根据字符或字符串替换,或通过正则表达式替换 String s = "hello"; s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w' s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替换为"~~" //正则表达式 String s = "A,,B;C ,D"; s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D" 分割字符串 要分割字符串,使用split()方法,并且传入的也是正则表达式: String s = "A,B,C,D"; String[] ss = s.split("\\,"); // {"A", "B", "C", "D"} 拼接字符串 拼接字符串使用静态方法join(),它用指定的字符串连接字符串数组: String[] arr = {"A", "B", "C"}; String s = String.join("***", arr); // "A***B***C" 类型转换 要把任意基本类型或引用类型转换为字符串,可以使用静态方法valueOf() String.valueOf(123); // "123" String.valueOf(45.67); // "45.67" String.valueOf(true); // "true" String.valueOf(new Object()); // 类似java.lang.Object@636be97c 要把字符串转换为其他类型,就需要根据情况。 //整型 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 注意:Integer有个getInteger(String)方法,它不是将字符串转换为int,而是把该字符串对应的系统变量转换为Integer Integer.getInteger("java.version"); // 版本号,11 转换为char[] String和char[]类型可以互相转换,修改了char[]数组,String并不会改变。 char[] cs = "Hello".toCharArray(); // String -> char[] String s = new String(cs); // char[] -> String 字符编码 在早期的计算机系统中,为了给字符编码,美国国家标准学会制定了一套英文字母、数字和常用符号的编码,它占用一个字节,编码范围从0到127,最高位始终为0,称为ASCII编码。 将汉字纳入计算机编码,一个字节是不够的。GB2312标准使用两个字节表示一个汉字,其中第一个字节的最高位始终为1,以便和ASCII编码区分开。类似的,日文有Shift_JIS编码,韩文有EUC-KR编码,这些编码因为标准不统一,同时使用,就会产生冲突。 为了统一全球所有语言的编码,全球统一码联盟发布了Unicode编码,它把世界上主要语言都纳入同一个编码,Unicode编码需要两个或者更多字节表示。 英文字符'A'的ASCII编码和Unicode编码: ┌────┐ ASCII: │ 41 │ └────┘ ┌────┬────┐ Unicode: │ 0041 │ └────┴────┘ 英文字符的Unicode编码就是简单地在前面添加一个00字节。 中文字符''的GB2312编码和Unicode编码: ┌────┬────┐ GB2312: │ d6 │ d0 │ └────┴────┘ ┌────┬────┐ Unicode: │ 4e │ 2d │ └────┴────┘ 英文字符的Unicode编码高字节总是00,包含大量英文的文本会浪费空间,所以,出现了UTF-8编码,它是一种变长编码,用来把固定长度的Unicode编码变成1~4字节的变长编码。通过UTF-8编码,英文字符'A'的UTF-8编码变为0x41,正好和ASCII码一致,而中文''的UTF-8编码为3字节0xe4b8ad。 UTF-8编码的另一个好处是容错能力强。如果传输过程中某些字符出错,不会影响后续字符,因为UTF-8编码依靠高字节位来确定一个字符究竟是几个字节,它经常用来作为传输编码。 注意:在Java中,char类型实际上就是两个字节的Unicode编码,转换编码后,就不再是char类型,而是byte类型表示的数组。 byte[] b1 = "Hello".getBytes(); // 按ISO8859-1编码转换,不推荐 byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8编码转换 byte[] b2 = "Hello".getBytes("GBK"); // 按GBK编码转换 byte[] b3 = "Hello".getBytes(StandardCharsets.UTF_8); // 按UTF-8编码转换 //已知编码的byte[]转换为String byte[] b = ... String s1 = new String(b, "GBK"); // 按GBK转换 String s2 = new String(b, StandardCharsets.UTF_8); // 按UTF-8转换

猜你喜欢

转载自www.cnblogs.com/nsss/p/11417601.html
今日推荐