计算(紧凑)字符串的内存使用量

问题描述 投票:2回答:1

使用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"));
java string java-9
1个回答
2
投票

使用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";
}
© www.soinside.com 2019 - 2024. All rights reserved.