2016-01-27 2 views
2

Я понимаю, что внутреннее представление Java для String - UTF-16. What is java string representation?Внутреннее представление строки Java

Кроме того, я знаю, что в строке UTF-16 каждый символ имеет один или два 16-разрядных кодовых блока.

Однако, когда я отлаживать следующий код Java

String hello = "Hello"; 

переменный привет представляет собой массив из 5 байт 0x48, 0x101, 0x108, 0x108, 0x111 который является ASCII для "Hello".

Как это может быть?

+3

Как вы отлаживаете это? Это всего лишь массив символов. – Ferrybig

+1

Вы уверены, что это не имя переменной, которое вы видите? – Fildor

+0

@Fildor 0x48 имеет представление «H», а не «h». – Maroun

ответ

3

Я взял gcore дамп мини процесса Java с этим кодом:

class Hi { 
    public static void main(String args[]) { 
     String hello = "Hello"; 
     try { 
      Thread.sleep(60_000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

И сделал дамп gcore памяти на Ubuntu. (Usign jps получить pid и передал, что gcore)

Если нашел это: 48 65 6C 6C 6F на свалке, используя двоичный редактор, так что где-то в памяти, как ASCII.

Но и 48 00 65 00 6C 00 6C, который является частью UTF-16 представления внутреннего представления String

+1

Да, это в ASCII (вернее UTF8) в постоянном пуле скомпилированного файла .class. – yole

+0

хорошо, поэтому этот ответ, в сочетании с комментарием @ yole выше (Intellij debugger несколько теперь обязательно показывает размер каждого символа) отвечает на вопрос. Спасибо! – yuz

1

String не указано, что это деталь реализации, так что вы не можете полагаться на него. Вполне вероятно, что в JDK-9 он будет изменен на использование двойного кодирования (Latin-1 для строк, которые могут быть закодированы в Latin-1, UTF-16 для других строк). См. JEP-254. Эта функция уже интегрирована в основную кодовую базу OpenJDK, поэтому, если вы используете ранние сборки Java-9, у вас будет фактически 5 байт.

Смежные вопросы