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

Java 计算(压缩)字符串的内存使用率,java,string,java-9,Java,String,Java 9,有了java的压缩字符串特性,是否有公共api来获取字符串的实际编码或内存使用情况?我可以调用包私有方法coder或私有方法isLatin1并调整计算,但两者都会导致非法反射访问警告 Method isLatin1 = String.class.getDeclaredMethod("isLatin1"); isLatin1.setAccessible(true); System.out.println((boolean)isLatin1.invoke("Jörn")); System.out.p

有了java的压缩字符串特性,是否有公共api来获取字符串的实际编码或内存使用情况?我可以调用包私有方法
coder
或私有方法
isLatin1
并调整计算,但两者都会导致
非法反射访问
警告

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"));
这很容易(但我不完全确定这是你想要的):

对于编码,没有公共API,但您可以推断它

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

谢谢,我不知道JOL,有趣的是看到头顶上的小琴弦。我可能不会直接使用它,而是根据这些值来估计大小。@JörnHorstmann是的。该项目中的一些示例要有趣得多,比如继承差距,或者
.class
中的巨大差距等等。这是一个很好的警告理由。您查询的是一个实现细节,该细节不能保证存在,也不能保证按照您的预期进行操作。如果将来的版本在三种不同的优化编码之间进行选择会怎么样?
private static String encoding(String s) {
    char[] arr = s.toCharArray();
    for (char c : arr) {
        if (c >>> 8 != 0) {
            return "UTF16";
        }
    }
    return "Latin1";
}