Вопросы о Строковом пуле Java [дубликат]

Анонимные функции, по нескольким причинам:

  1. для создания быстрой функции для одноразового использования, как 3x^2+2x+7. (см. упоминание ниже), Это полезно для функций как quad и fminbnd, которые берут функции в качестве аргументов. Это также удобно в сценариях (.m файлы, которые не запускаются с функционального заголовка), с тех пор в отличие от истинных функций, Вы не можете включать подфункции.
  2. для закрытия - хотя анонимные функции немного ограничивают, поскольку, кажется, нет способа иметь присвоение в них для видоизменения состояния.

.

% quick functions
f = @(x) 3*x.^2 + 2*x + 7;
t = (0:0.001:1);
plot(t,f(t),t,f(2*t),t,f(3*t));

% closures (linfunc below is a function that returns a function,
% and the outer functions arguments are held for the lifetime
% of the returned function.
linfunc = @(m,b) @(x) m*x+b;
C2F = linfunc(9/5, 32);
F2C = linfunc(5/9, -32*5/9);

68
задан Andrew Tobilko 27 October 2016 в 12:02
поделиться

4 ответа

Если вы используете ключевое слово new , будет создан новый объект String . Обратите внимание, что объекты всегда находятся в куче - пул строк не является отдельной областью памяти, отдельной от кучи.

Пул строк подобен кешу. Если вы сделаете это:

String s = "abc";
String p = "abc";

, то компилятор Java достаточно умен, чтобы создать только один объект String , и s и p будут ссылаться на него. тот же объект String. Если вы сделаете это:

String s = new String("abc");

, тогда в пуле будет один объект String , который представляет литерал «abc» , и будет отдельный Объект String , не находящийся в пуле, который содержит копию содержимого объединенного объекта. Поскольку String неизменяема в Java, вы вы ничего не получите, делая это; вызов new String ("literal") никогда не имеет смысла в Java и излишне неэффективен.

Обратите внимание, что вы можете вызвать intern () в String объект. Это поместит объект String в пул, если его еще нет, и вернет ссылку на объединенную строку. (Если он уже был в пуле, он просто возвращает ссылку на объект, который уже был там). Дополнительную информацию см. В документации API для этого метода.

См. Также Интернирование строк (Википедия).

Это поместит объект String в пул, если его еще нет, и вернет ссылку на объединенную строку. (Если он уже был в пуле, он просто возвращает ссылку на объект, который уже был там). Дополнительную информацию см. В документации API для этого метода.

См. Также Интернирование строк (Википедия).

Это поместит объект String в пул, если его еще нет, и вернет ссылку на объединенную строку. (Если он уже был в пуле, он просто возвращает ссылку на объект, который уже был там). Дополнительную информацию см. В документации API для этого метода.

См. Также Интернирование строк (Википедия).

95
ответ дан 24 November 2019 в 14:16
поделиться

В байт-коде первое присвоение:

  Code:
   0:   ldc     #2; //String abc
   2:   astore_1

, тогда как второе:

   3:   new     #3; //class java/lang/String
   6:   dup
   7:   ldc     #2; //String abc
   9:   invokespecial   #4; //Method java/lang/String."":(Ljava/lang/String;)V

Итак, первое находится в пуле (в позиции # 2), тогда как второй будет сохранен в куче.

EDIT

Поскольку CONSTANT_String_info хранит индекс как U2 (16 бит, без знака), пул может содержать максимум 2 ** 16 = 65535 ссылок. Если вас интересует , здесь больше ограничений JVM .

12
ответ дан 24 November 2019 в 14:16
поделиться

The only time you should use new String(foo) is when you want to break ==, which is an odd case, or when foo is a substring of a much larger string that has a limited lifetime, such as

String mystring;
{
   String source = getSomeHeinouslyLargeString();
   mystring = new String(source.substring(1,3));
}
2
ответ дан 24 November 2019 в 14:16
поделиться

Каждый раз, когда ваш код создает строковый литерал

, например:

String str="Hello"; (string literal) 

, JVM сначала проверяет пул строковых литералов. Если строка уже существует в пуле, возвращается ссылка на объединенный в пул экземпляр. Если строка не существует в пуле, создается новый объект String, который затем помещается в пул. Java может выполнить эту оптимизацию, поскольку строки неизменяемы и могут использоваться совместно, не опасаясь повреждения данных

7
ответ дан 24 November 2019 в 14:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: