在很多编程语言中对字符串的处理都很重要,这也是面试经常会问到的,如果掌握地不牢固很容易答不上来
Java字符串
在Java中,String
是一个引用类型。但由于字符串广泛应用于Java编程中,Java编译器对字符串进行了处理,可以直接用两个"
来表示字符串。
// 我们通常的做法
String s = "Hello World!";
// 下面这种写法也可以
String s = new String("Hello World!");
// 还可以这样写 String内部是通过一个char[]表示的
String s = new String(new char[] {
'H', 'e', 'l', 'l', 'o', '!'});
Java字符串的一个重要特点就是字符串不可变(内容)。
- 声明的字符串变量是可变的
- 字符串本身是不变的
String s1 = "Hello"; // 此时有一块内存存着"Hello", 且可通过s1访问它
s1 = "World"; // 此时有一块内存存着"Hello", 还有一块内存存着"World", 通过s1只能找到"World", "Hello"并未改变
这里可以去看一下简单的堆栈内存分析
Java字符串操作
字符串比较
只能用equals()
方法,==
是不可靠的。
e.g.
String s1 = "Hello";
String s2 = "Hello";
String s3 = "World";
String s4 = "wOrLd";
System.out.println(s1.equals(s2)); // true
System.out.println(s3.equals(s4)); // false
System.out.println(s3.equalsIgnoreCase(s4)); // true
子串查找或搜索
indexOf()
从左向右查找子串并返回下标lastIndexOf()
从右向左查找子串并返回下标contains()
判断是否包含某个子串startWith()
判断是否以某个子串开头endWith()
判断是否以某个子串结尾
String s1 = "Are you ok ?";
System.out.println(s1.indexOf("o"));
System.out.println(s1.lastIndexOf('o'));
System.out.println(s1.contains("you"));
System.out.println(s1.startsWith("are"));
System.out.println(s1.endsWith(" ?"));
// 输出:
// 5
// 8
// true
// false
// true
字符串拼接
+
拼接
在输出时,可以直接使用+
对字符串和数字进行拼接输出。
String s1 = "Hello";
int n1 = 8848;
float f1 = 10.24f;
boolean b1 = false;
System.out.println(s1 + n1 + f1+ b1);
// 输出:
// Hello884810.24false
字符串之间使用+
拼接
String s1 = "Hello";
String s2 = "World";
String s3 = s1 + ' ' + s2; // s3 = "Hello World"
- 静态方法
join()
:使用字符串连接字符串数组
String[] sArr = {
"Hello", "Hi", "Bye"};
String s = String.join("--", sArr); // 静态方法 所以是String.join()
System.out.println(s);
// 输出:
// Hello--Hi--Bye
去除首尾空白字符串
trim()
trim()
去除首尾空格
(英文),\t
,\r
,\n
String s1 = " Hello \u3000"; // \u3000是中文空格Unicode编码(站长之家有转换工具 感兴趣的可以看看)
String s2 = "\t\nWorld \r ";
System.out.println(s1.trim());
System.out.println(s2.trim());
// 输出:
// `Hello `
// `World`
strip()
strip()
包括trim()
的功能,并且还能去除类似中文空格的空格stripLeading
仅去除左端空格stripTrailing
仅去除右端空格
String s1 = " Hello \u3000";
String s2 = "\t\nWorld \r ";
System.out.println(s1.strip());
System.out.println(s2.strip());
// 输出:
// `Hello`
// `World`
字符串分割
split
String s1 = "Are you ok ?";
String[] sArr = s1.split(" ");
System.out.println(Arrays.toString(sArr)); // 推荐这种打印方式 别用for
// 输出:
// [Are, you, ok, ?]
substring()
substring()
其本质是提取子串,这里也可以看成是一种分割
String s1 = "Are you ok ?";
System.out.println(s1.substring(4)); // [4, s1.length()-1]
System.out.println(s1.substring(4, 7)); // [4, 7)
// 输出:
// you ok ?
// you
子串替换
replace()
replace()
不改变原字符串,会返回一个新字符串
String s1 = "Are you ok ?";
String s2 = s1.replace("o", "ooo"); // 要么用另一个变量接收 要么直接打印 s1未改变
System.out.println(s2);
格式化输出
format()
静态方法,注意用String.format()
即可
String s = "My name is %s, and I'm %d years olds.";
System.out.println(String.format(s, "XXX", 18));
// 输出:
// My name is XXX, and I'm 18 years olds.
类型转换
String与char[]相互转换
String s1 = "Hello World!";
char[] sArr = s1.toCharArray();
String s2 = new String(sArr);
System.out.println(Arrays.toString(sArr));
System.out.println(s2);
// 输出:
// [H, e, l, l, o, , W, o, r, l, d, !]
// Hello World!
String与基本数据类型转换
这里转换比较简单,需要注意静态方法
不属于实例,所以应该用类
来调用
String s1 = "123";
String s2 = "123.45f";
String s3 = "false";
float f = 80.86f;
System.out.println(Integer.parseInt(s1));
System.out.println(Float.parseFloat(s2));
System.out.println(Boolean.parseBoolean(s3));
System.out.println(String.valueOf(f));
// 输出:
// 123
// 123.45
// false
// 80.86