工具类
StringBuffer & StringBuilder
StringBuffer、StringBuilder 和 String 一样,也用来代表字符串。String 类是不可变类,任何对 String 的改变都 会引发新的 String 对象的生成;StringBuffer 则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。StringBuffer 支持并发操作,线性安全的,适合多线程中使用。StringBuilder 不支持并发操作,线性不安全的,不适合多线程中使用。新引入的 StringBuilder 类不是线程安全的,但其在单线程中的性能比 StringBuffer 高。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
StringBuffer sb = new StringBuffer(BASEINFO);
for (int i = 0; i < COUNT; i++) {
sb = sb.append("miss");
}
StringBuilder sb = new StringBuilder(BASEINFO);
long starttime = System.currentTimeMillis();
for (int i = 0; i < COUNT; i++) {
sb = sb.append("miss");
}
StringBuffer
以下是 StringBuffer 类支持的主要方法:
序号 | 方法描述 |
---|---|
1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列 |
2 | public StringBuffer reverse() 将此字符序列用其反转形式取代 |
3 | public delete(int start, int end) 移除此序列的子字符串中的字符 |
4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中 |
5 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符 |
MD5
MD5 是一种广泛使用的加密哈希函数,可产生 128 位的哈希。
MessageDigest
我们在 java.security.MessageDigest 类中具有哈希功能。这个想法是首先使用要用作 Singleton 参数的算法实例化 MessageDigest:
MessageDigest.getInstance(String Algorithm)
@Test
public void givenPassword_whenHashing_thenVerifying()
throws NoSuchAlgorithmException {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] digest = md.digest();
String myHash = DatatypeConverter
.printHexBinary(digest).toUpperCase();
assertThat(myHash.equals(hash)).isTrue();
// 针对文件处理
String filename = "src/test/resources/test_md5.txt";
md.update(Files.readAllBytes(Paths.get(filename)));
}
Apache Commons
@Test
public void givenPassword_whenHashingUsingCommons_thenVerifying() {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";
String md5Hex = DigestUtils
.md5Hex(password).toUpperCase();
assertThat(md5Hex.equals(hash)).isTrue();
}
Guava
@Test
public void givenFile_whenChecksumUsingGuava_thenVerifying()
throws IOException {
String filename = "src/test/resources/test_md5.txt";
String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";
HashCode hash = com.google.common.io.Files
.hash(new File(filename), Hashing.md5());
String myChecksum = hash.toString()
.toUpperCase();
assertThat(myChecksum.equals(checksum)).isTrue();
}