Java 复习笔记(五) - 转自 廖雪峰的 Java 教程
字符串和编码
从表面上看,两个字符串用 ==
和 equals()
比较都为 true
,但实际上那只是 Java 编译器在编译期,会自动把所有相同的字符串当作一个对象放入常量池,自然两个字符串的引用就是相同的。
所以,两个字符串判断是否相同,必须用 equals()
。
复制对象 obj.clone()
。
System.setProperty("java.version", "11");
System.out.println(System.getProperty("java.version"));
System.out.println(Integer.getInteger("java.version")); // 版本号,11
我获取到的 java.version
为 null
,说明系统变量中不存在这样的变量名。我本地测试版本 jdk 1.8,可能是 Java 版本比较低的原因没有获取到。
通过系统变量设置函数 setProperty
设置的值只能是字符串,且字符串需要可以转化为 Integer
,否则 Integer.getInteger
获取到值会一直为 null 。比如设置 java.version
为 "1.8"
,则 Integer.getInteger
返回 null。
总结:
- Java 字符串 String 是不可变对象;
- 字符串操作不改变原字符串内容,而是返回新字符串;
- 常用的字符串操作:提取子串、查找、替换、大小写转换等;
- Java 使用 Unicode 编码表示 String 和 char;
- 转换编码就是将 String 和 byte[] 转换,需要指定编码;
- 转换为 byte[] 时,始终优先考虑 UTF-8 编码。
StringBuilder 可变字符串
构造 Insert 语句
public class Main {
public static void main(String[] args) {
String[] fields = { "name", "position", "salary" };
String table = "employee";
String insert = buildInsertSql(table, fields);
System.out.println(insert);
String s = "INSERT INTO employee (name, position, salary) VALUES (?, ?, ?)";
System.out.println(s.equals(insert) ? "测试成功" : "测试失败");
}
static String buildInsertSql(String table, String[] fields) {
var sb = new StringBuilder(1024);
sb.append("INSERT INTO " + table + " (");
for(int i = 0;i < fields.length; i++) {
if (i == fields.length - 1) {
sb.append(fields[i]);
} else {
sb.append(fields[i] + ", ");
}
}
// sb.append(String.join(", ", fields));
sb.append(") VALUES (?, ?, ?)");
return new String(sb);
}
}
总结:
- StringBuilder 是可变对象,用来高效拼接字符串;
- StringBuilder 可以支持链式操作,实现链式操作的关键是返回实例本身;
- StringBuffer 是 StringBuilder 的线程安全版本,现在很少使用