字符串和编码

从表面上看,两个字符串用 ==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.versionnull,说明系统变量中不存在这样的变量名。我本地测试版本 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 的线程安全版本,现在很少使用

摘自:Java 教程 - 廖雪峰