在Java中,字符和字符串是两个不同的类型。
字符类型char是基本数据类型,一个char保存一个Unicode字符,Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可
int n1 = 'A'; // 字母“A”的Unicodde编码是65
int n2 = '中'; // 汉字“中”的Unicode编码是20013
和char类型不同,字符串类型String是引用类型,我们用双引号"..."表示字符串。一个字符串可以存储0个到任意个字符。
1、基本用法
展示基本用法,看几句代码就OK了
package com.practice;
import java.util.Arrays;
public class StringPractice {
public static void main(String[] args) {
// 字符串创建,不推荐
String string = new String("java is the best language in the world");
// 直接这样
String string = "java is the best language in the world";
// 字符串长度
System.out.printf("字符串长度为%d\n", string.length());
// 获取类型
System.out.println(string.getClass().getName());
// 遍历字符串,注意字符串遍历出来是字符类型
for (int i = 0; i < string.length(); i += 5) {
System.out.println(string.charAt(i));
}
// 字符串索引
System.out.println(string.indexOf("best"));
// 字符串是否包含某个子串
System.out.println(string.contains("java"));
// 字符串转化大写
System.out.println(string.toUpperCase());
// 字符串截取,左开右闭
System.out.println(string.substring(8, 13));
// 字符串分割,会分割成数组
String[] s = string.split(" ");
System.out.println(Arrays.toString(s));
// 用字符串拼接数组,是字符串方法
System.out.println(String.join("+", s));
// 和char转换,会把字符串转化为字符数组
char[] ch = string.toCharArray();
System.out.println(ch);
// 字符串替换
System.out.println(string.replace("best", "worst"));
}
}
字符串拼接多说一嘴,+号拼接:
String a = "aaa" + "bbb";
字符串方法拼接:
String a = "aaa".concat("bbb");
2、StringBuilder类
但是当我们字符串拼接的东西过多时,可以使用StringBuilder类,高效拼接。
append用来追加、insert用来插入
StringBuilder类还有其他方法,可以自行查询
StringBuilder sb = new StringBuilder(string);
sb.append(" hahaha")
.append(" hahaha")
.append(" aaa")
.insert(0, "my");
System.out.println(sb.toString());
你可能还听说过StringBuffer,这是Java早期的一个StringBuilder的线程安全版本,它通过同步来保证多个线程操作StringBuffer也是安全的,但是同步会带来执行速度的下降。
StringBuilder和StringBuffer接口完全相同,现在完全没有必要使用StringBuffer。
3、字符串比较
当我们想要比较两个字符串是否相同时,要特别注意,我们实际上是想比较字符串的内容是否相同。必须使用equals()方法而不能用==。
public class Main {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO".toLowerCase();
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); //true
}
}
两个字符串比较,必须总是使用equals()方法。
要忽略大小写比较,使用equalsIgnoreCase()方法。
4、其他方法
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
" \tHello\r\n ".trim(); // "Hello",用来去除首尾空白字符
另一个strip()方法也可以移除字符串首尾空白字符。它和trim()不同的是,类似中文的空格字符\u3000也会被移除:
"\u3000Hello\u3000".strip(); // "Hello"
String还提供了isEmpty()和isBlank()来判断字符串是否为空和空白字符串:
"".isEmpty(); // true,因为字符串长度为0
" ".isEmpty(); // false,因为字符串长度不为0
" \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符
5、格式化字符串
字符串提供了formatted()方法和format()静态方法,可以传入其他参数,替换占位符,然后生成新的字符串:
public class Main {
public static void main(String[] args) {
String s = "Hi %s, your score is %d!";
System.out.println(s.formatted("Alice", 80));
System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5));
}
}
不知道什么,用%s占位总OK的
String.format("Hi %s, your score is %s!", "Bob", 59.5)
6、类型转换
其他类型转字符串,用String.valueOf()
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@6
字符串转化为其他类型:
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
字符串和字符互转:
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String
最后,字符串是不可变对象