【0x19】Java字符串和编码

在Java中,String是一个引用类型,它本身也是一个class。但是,Java编译器对String有特殊处理,即可以直接用"…"来表示一个字符串。
字符串的表示方式有3种:

package program;

import java.util.Arrays;
public class Main{
    public static void main(String[] args){
        String s1 = "s1"; // 第一种
        String s2 = new String("s2"); // 第二种
        String s3 = new String(new char[] {'s','3'}); // 第三种
        

        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}

实际上字符串在String内部是通过一个char[]数组表示的.
Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]字段,以及没有任何修改char[]的方法实现的。

字符串比较

比较字符串的内容是否相同时,必须使用equals()方法而不能用==。因为==是比较地址是否相同,而equals才是比较字符串内容是否相同。

我们先看个例子:

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

从表面上看,两个字符串用==和equals()比较都为true,但实际上那只是Java编译器在编译期,会自动把所有相同的字符串当作一个对象放入常量池,自然s1和s2的引用就是相同的。所以==为true。所以,这种==比较返回true纯属巧合。换一种写法,==比较就会失败:

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));
    }
}

因为这是运行时做的事情,而不是编译时。
要忽略大小写比较,使用equalsIgnoreCase()方法。
Demo:

package program;

import java.util.Arrays;
public class Main{
    public static void main(String[] args){
        String s1 = "Hello";
        String s2 = "heLLo";
        System.out.println(s1.equalsIgnoreCase(s2));
    }
}

String类还提供了多种方法来搜索子串、提取子串。常用的方法有:

in运算。

// 子串是否存在
"Hello".contains("ll"); // true
// 相当于python中的   "ll" in "Hello"

注意到contains()方法的参数是CharSequence而不是String,因为CharSequence是String的父类。所以说在这儿只能老老实实的穿字符串,而不是字符数组。因为CharSequence可不是Char的父类。
更多实例:

字符串索引:

String ss = "fsfgeth";
ss.charAt(3); // g
// ss.charAt(index)

字符串长度:

String ss = "fdsgg";
ss.length(); // 5

子串替换:

String ss = "dsa";
String kk = ss.replace("d","fff"); // old串, new串
System.out.println(kk); // fffsa

子串位置搜索:

"Hello".indexOf("l"); // 2  找第一个l的index
"Hello".lastIndexOf("l"); // 3  找最后一个l的index

是否以…开头/结尾:

"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true

字符串切片:

"Hello".substring(2); // "llo"
"Hello".substring(2, 4); "ll"

字符串分割:
split接受的参数是一个正则字符串

String ss = "dsa ";
String[] arr = ss.split("");
System.out.println(Arrays.toString(arr)); // ["d","s","a"]
arr = ss.split("s");// ["d","a "]

注意和python的区别,python如果是split()的话,会按照空白分割。

把大写字母变小写:

String ss = "dsa A12";
String kk = ss.toLowerCase();
System.out.println(kk);

小写字母变大写:

String ss = "dsa A12";
String kk = ss.toUpperCase();
System.out.println(kk);

字符串拼接:
效率比直接用加号好很多。

String ss = "dsa A12";
String kk = ss.concat(ss); // 字符串拼接
System.out.println(kk);

静态join方法:

String[] arr = {"A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"

去掉首位空白字符:

忽略大小写比较串是否相等:

String ss = "dasd";
System.out.println(ss.equalsIgnoreCase("DASD")); // true

获得某个index的元素的码点(即 a: 97之类的值):

String ss = "我啊";
System.out.println(ss.codePointAt(1)); // 21834
// 原因:啊的utf码点为21834

字符串比较大小:
按照字典序逐一比较。

String ss = "abc";
System.out.println(ss.compareTo("abc"));

相等返回0,ss小于参数返回-1,大于返回1。

字符串相等判断,接受StringBuffer类型:

String ss = "abd";
System.out.println(ss.contentEquals("fds"));

字符串转字符数组:

String ss = "abd";
char[] dst = new char[ss.length()];
ss.getChars(0,3,dst,0);
System.out.println(Arrays.toString(dst));
发布了333 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/103662032