Рассчитать использование памяти (компактных) строк - PullRequest
0 голосов
/ 10 сентября 2018

С помощью функции компактных строк в 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 Ответ

0 голосов
/ 10 сентября 2018

Это довольно легко с 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";
}
...