Archive for category Java
Java и $
Мало кто знает, что в Java в идентификаторах допускается использование символа $ наряду с латинскими буквами, цифрами и сиволом подчеркивания. Потому следующий код синтаксически верный:
int total$ = 0;
for (int $ : bank$)
total$ += $;
return total$;
}
Интересующиеся могут просмотреть Java Language Specification, Third Edition (§3.8).
Знак доллара используется компилятором Java в именах внутренних и анонимных классов. Использовать этот знак в коде не рекоммендуется ни спецификацией ни мною.
Что выведет этот код?
Простой код на знание порядка выбора метода из перегруженных вариантов.
public static void main(String[] args) {
foo(0, 1);
foo((int) 0, 1);
foo((Integer) 0, 1);
}
public static void foo(int a, int b) {
System.out.print("A");
}
public static void foo(int... args) {
System.out.print("B");
}
public static void foo(Integer... args) {
System.out.print("C");
}
}
Цикл по элементам java.util.Map
Бывают случаи, когда нужно пройтись по всем парам ключ=значение в коллекции java.util.Map. Простая реализация этого:
for (String key : map.keySet()) {
String value = map.get(key);
// ...
}
Существует и другой способ, когда цикл проходит по парам, а не по ключам:
for (Map.Entry<String, String> entry: map.entrySet()) {
String key= entry.getKey();
String value = entry.getValue();
// ...
}
Теоретически, предпочтительнее второй вариант. В первом случае каждую итерацию происходит поиск элемента по его ключу в таблице хешей. Во втором же я получаю сразу и ключ и значение без дополнительных затрат. Тем временем тесты времени выполнения двух этих алгоритмов показывают, что различие несущественно.
Среднее время теста №1: 19568284 наносекунд
Среднее время теста №2: 17059243 наносекунд
Для объектов Map<String, String>, состоящих из 100000 элементов, где ключи являются случайной строкой длиной от 1 до 30 латинских символов. Среднее время выполнения полной итерации выбиралось по результатам 1000 тестов.
