Pattern.quote("pattern")返回\Qpattern\E.如果字符串中没有元字符,是否真的有必要对字符串进行字面化?
当我运行这个测试
public class Test extends Thread {
String str;
Test(String s) {
this.str = s;
}
@Override
public void run() {
try {
FileWriter fw = new FileWriter("1.txt", true);
for (char c : str.toCharArray()) {
System.out.print(c);
fw.write(c);
}
fw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
new File("1.txt").delete();
new Test("11111111111111111111").start();
new Test("22222222222222222222").start();
}
}
Run Code Online (Sandbox Code Playgroud)
它显示了它如何将字符写入1.txt
2222222222222222111211111211111121211111
Run Code Online (Sandbox Code Playgroud)
但在1.txt中我看到了不同的结果
2222222222222222222211111111111111111111
Run Code Online (Sandbox Code Playgroud)
这是为什么?
java.util.Set API声明:
集合不包含元素对e1和e2,使得e1.equals(e2)
但据我所知,TreeSet用于Comparable/Comparator确定e1和e2是否重复.我错过了什么吗?
看看这个测试
String s1 = "1234";
String s2 = "123";
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value1 = (char[]) field.get(s1);
char[] value2 = (char[]) field.get(s2);
System.out.println(value1 == value2);
Run Code Online (Sandbox Code Playgroud)
它打印false,这意味着JVM为s1和s2保存两个不同的char数组.任何人都可以解释为什么s1和s2不能共享相同的char数组?似乎java.lang.String是为内容共享而设计的,不是吗?
注意:我不了解所有JVM.这是Oracle的Java HotSpot(TM)客户端VM 22.1-b02(JRE 1.7).
UPDATE
在另一方面,如果部分共享是罕见的(似乎这只是由String.substring创建字符串),那么为什么要把所有的字符串也有int count和int offset领域?这是8个无用的字节.这不仅是尺寸,也是创作速度.对象越大,初始化时间越长.这是一个测试
long t0 = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
new String("xxxxxxxxxxxxx");
}
System.out.println(System.currentTimeMillis() - t0);
Run Code Online (Sandbox Code Playgroud)
需要~200ms.如果我使用这个课程
class String2 {
char[] value;
String2(String2 s) {
value = s.value;
}
}
Run Code Online (Sandbox Code Playgroud)
大约需要140毫秒.