Анонимные функции, по нескольким причинам:
quad
и fminbnd
, которые берут функции в качестве аргументов. Это также удобно в сценариях (.m файлы, которые не запускаются с функционального заголовка), с тех пор в отличие от истинных функций, Вы не можете включать подфункции. .
% 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);
Если вы используете ключевое слово 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 для этого метода.
См. Также Интернирование строк (Википедия).
В байт-коде первое присвоение:
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 .
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));
}
Каждый раз, когда ваш код создает строковый литерал
, например:
String str="Hello"; (string literal)
, JVM сначала проверяет пул строковых литералов. Если строка уже существует в пуле, возвращается ссылка на объединенный в пул экземпляр. Если строка не существует в пуле, создается новый объект String, который затем помещается в пул. Java может выполнить эту оптимизацию, поскольку строки неизменяемы и могут использоваться совместно, не опасаясь повреждения данных