Posts Tagged java
Некорректная работа java.net.CookieManager
При работе с классом java.net.CookieManager иногда возникают странные баги. Например, следующий фрагмента кода будет работать с указанным URL, но с некоторыми другими не будет:
CookieManager manager = new CookieManager();
CookieHandler.setDefault(manager);
URL url = new URL(urlString);
URLConnection connection = url.openConnection();
// force cookie processing
Object content = connection.getContent();
CookieStore cookieJar = manager.getCookieStore();
List HttpCookie> cookies = cookieJar.getCookies();
for (HttpCookie cookie : cookies) {
System.out.println(cookie);
}
Под катом подробнее.
Read the rest of this entry »
Тернарный оператор
Что выведет этот код?
public static void main(String[] args) {
System.out.println(get(1));
System.out.println(get(null));
}
public static Integer get(Integer in) {
return true ? in : 0;
}
}
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 тестов.
