代码之家  ›  专栏  ›  技术社区  ›  Jörn Horstmann

计算(压缩)字符串的内存使用率

  •  2
  • Jörn Horstmann  · 技术社区  · 6 年前

    使用Java的紧凑字符串特性,有一个公共API来获取字符串的实际编码或内存使用吗?我可以调用包私有方法 coder 或私有方法 isLatin1 并调整计算,但两者都会导致 Illegal reflective access 警告。

    Method isLatin1 = String.class.getDeclaredMethod("isLatin1");
    isLatin1.setAccessible(true);
    System.out.println((boolean)isLatin1.invoke("Jörn"));
    System.out.println((boolean)isLatin1.invoke("foobar"));
    System.out.println((boolean)isLatin1.invoke("\u03b1"));
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Eugene    6 年前

    这很容易 JOL (但我不完全确定这是你想要的):

    String left = "Jörn"; 
    System.out.println(GraphLayout.parseInstance(left).totalSize()); // 48 bytes
    
    String right = "foobar";
    System.out.println(GraphLayout.parseInstance(right).totalSize()); // 48 bytes
    
    String oneMore = "\u03b1";
    System.out.println(GraphLayout.parseInstance(oneMore).totalSize()); // 48 bytes
    

    对于编码来说,没有公共的API,但是你可以推断它…

    private static String encoding(String s) {
        char[] arr = s.toCharArray();
        for (char c : arr) {
            if (c >>> 8 != 0) {
                return "UTF16";
            }
        }
        return "Latin1";
    }