Posts Tagged java

Некорректная работа java.net.CookieManager

При работе с классом java.net.CookieManager иногда возникают странные баги. Например, следующий фрагмента кода будет работать с указанным URL, но с некоторыми другими не будет:

String urlString = "http://java.sun.com";
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 »

,

No Comments

Тернарный оператор

Что выведет этот код?

class Main {
   
    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;
    }
}

1 Comment

Java и $

Мало кто знает, что в Java в идентификаторах допускается использование символа $ наряду с латинскими буквами, цифрами и сиволом подчеркивания. Потому следующий код синтаксически верный:

static int total$(int bank$[]) {
    int total$ = 0;
    for (int $ : bank$)
        total$ += $;
    return total$;
}

Интересующиеся могут просмотреть Java Language Specification, Third Edition (§3.8).

Знак доллара используется компилятором Java в именах внутренних и анонимных классов. Использовать этот знак в коде не рекоммендуется ни спецификацией ни мною.

No Comments

Что выведет этот код?

Простой код на знание порядка выбора метода из перегруженных вариантов.

public class VarArgs {
   
    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");
    }

}

1 Comment

Цикл по элементам java.util.Map

Бывают случаи, когда нужно пройтись по всем парам ключ=значение в коллекции java.util.Map. Простая реализация этого:

Map<String, String> map = getMap();
for (String key : map.keySet()) {
    String value = map.get(key);
    // ...
}

Существует и другой способ, когда цикл проходит по парам, а не по ключам:

Map<String, String> map = getMap();
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 тестов.

, ,

1 Comment