小编Evg*_*eev的帖子

为什么Pattern.quote总是返回带引号的字符串?

Pattern.quote("pattern")返回\Qpattern\E.如果字符串中没有元字符,是否真的有必要对字符串进行字面化?

java regex optimization pattern-matching

2
推荐指数
1
解决办法
364
查看次数

从两个线程写入一个文件会产生意外结果

当我运行这个测试

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

2
推荐指数
1
解决办法
57
查看次数

java.util.Set API中可能存在的错误

java.util.Set API声明:

集合不包含元素对e1和e2,使得e1.equals(e2)

但据我所知,TreeSet用于Comparable/Comparator确定e1和e2是否重复.我错过了什么吗?

java collections javadoc comparator

0
推荐指数
1
解决办法
158
查看次数

JVM能否更聪明地共享字符串数据?

看看这个测试

    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 countint 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毫秒.

java string

0
推荐指数
1
解决办法
157
查看次数