Updated on 2016-10-09
- String:字符串常量
- 一旦被创建就不能修改它的值,而是通过重新创建一个新的对象并重新引用。
- StringBuffer:字符串变量(线程安全)
- 对 StringBuffer 本身进行操作,更适用于对字符串的修改。
- StringBuilder:字符串变量(非线程安全)
- 等价于 StringBuffer,应用于单线程,不执行同步操作。
性能:StringBuilder > StringBuffer > String
String
String str = "ABCDEFGH";
String.valueOf(1.687f) 1.687 转换为字符串
String.format("%s-%d-%b", "abc", 3, true) abc-3-true 格式化字符串
str.length() 8 字符串长度
str.charAt(2) C 索引字符串
str.indexOf("EFG") 4 索引字符串
str.isEmpty() false 是否为空
str.contains("ABC") true 是否包含
str.equals("ABC") false 比较内容
str.regionMatches(0, "DABC", 1, 3) true 比较部分内容 原从0开始,新从1开始,比较长度为3
str.startsWith("ABC") true 比较开头
str.endsWith("ABC") false 比较结尾
str.trim() 去除开头和结尾的空格
str.toLowerCase() abcdefgh 大小写转换
str.concat("123") ABCDEFGH123 追加
str.replace("B", " ") A CDEFGH 替换
str.substring(2, 6) CDEF 截取字符串 返回 String
str.subSequence(2, 6) CDEF 截取字符串 返回 CharSequence
str.split(" ") 以空格为分隔符,返回字符串数组 返回 String[]
str.toCharArray() 返回字符数组 返回 Char[]
str.matches(".*0 /.*+.*") 使用正则表达式匹配内容
Tips:
字符串索引范围从 0 开始,到 str.length()-1 结束。
indexOf 没有匹配结果会返回 -1。
substring 包括开始位置的字符,不包括结束位置的字符。 [2,6)
StringBuilder and StringBuffer
StringBuilder str = new StringBuilder("ABCDEFGH");
str.toString(); ABCDEFGH 转换为String
str.reverse(); HGFEDCBA 反转
str.setCharAt(1,' '); A CDEFGH 替换
str.append(123); ABCDEFGH123 追加
str.insert(1, "123"); A123BCDEFGH 插入
String str1 = "123"; 涉及 1 个对象(常量池中)
String str2 = new String("123"); 涉及 2 个对象(使用 new 关键字生成的对象会存放于堆区中)
str1 == str2 false 显式 new 了一个对象,内存地址不相同
str1.equals(str2) true 内容相同
-------------------------------------------------------
public class A {
public static void main(String[] args) {
String str = "123456";
for (char i : new StringBuilder(str).reverse().toString().toCharArray()) { ①
System.out.println(i);
}
}
}
注 ①:
String ➜ StringBuilder ➜ 反转 ➜ String ➜ char[]
----
输出:
6
5
4
3
2
1
-------------------------------------------------------
public class A {
public static void main(String[] args) {
String str = "abcdef";
for (char i : str.toCharArray()) {
System.out.println(i - 'a' + 1); eg. b ➜ 98 - 97 + 1 = 2
}
}
}
----
输出:
1
2
3
4
5
6
-------------------------------------------------------
public class A { URL 编码
public static void main(String[] args) {
String format = String.format("A=%s&B=%04d&C=%.2f", "字", 123, 123.123);
String encode = URLEncoder.encode("中国ABC", "utf-8");
String decode = URLDecoder.decode(encode, "utf-8");
String s = String.format("%-15s", "A");
System.out.println(format);
System.out.println(encode);
System.out.println(decode);
System.out.println(s + "B");
}
}
----
输出:
A=字&B=0123&C=123.12
%E4%B8%AD%E5%9B%BDABC
中国ABC
A B
Note:
%d Digital 123
%f Float 1.23
%s String "ABC"
%c Char 'A'
%b Boolean true
-------------------------------------------------------
public class A { Base64 编码
public static void main(String[] args) throws IOException {
String str = "123ABC中国";
BASE64Encoder base64Encoder = new BASE64Encoder();
BASE64Decoder base64Decoder = new BASE64Decoder();
String encode = base64Encoder.encode(str.getBytes("utf-8"));
byte[] decode = base64Decoder.decodeBuffer(encode);
System.out.println(encode);
System.out.println(new String(decode, "utf-8"));
}
}
----
输出:
MTIzQUJD5Lit5Zu9
123ABC中国
-------------------------------------------------------
public class A { 判断是否为回文
public static void main(String[] args) {
a(); 第一种方式
b(); 第二种方式
}
private static void a() {
String str = "12321";
String s = new StringBuilder(str).reverse().toString();
System.out.println(str.equals(s));
}
private static void b() {
String str = "12321";
int length = str.length();
int count = length % 2 == 0 ? length / 2 : (length - 1) / 2;
for (int x = 0, y = 1; count != 0; count--, x++, y++) {
if (str.charAt(x) != str.charAt(length - y)) {
System.out.println("false");
return;
}
}
System.out.println("true");
}
}
----
输出:
true
true