Ошибка Java Hashtable.contains () - PullRequest
1 голос
/ 23 мая 2011

Я использую последнюю версию Java для x64.

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

Я обнаружил, что Hashtable имеет нежелательное поведение.Вот пример фрагмента кода:

public class Test {
    public static void main(String[] args) {
        Hashtable<MyObject, MyObject> table = 
            new Hashtable<MyObject, MyObject>();

        MyObject myObj = new MyObject();
        System.out.println(myObj.hashCode());
        System.out.println(myObj.equals(myObj));

        if (!table.contains(myObj)) {
            System.out.println("OK");
            table.put(myObj, myObj);
        }

        if (!table.contains(myObj)) {
            System.out.println("ERROR");
            System.out.println(table);
        }

    }
}

Вот результат:

1500
true
OK
ERROR
{"myObject"="myObject"}

Есть какие-нибудь подсказки, как это происходит?Может кто-то указать на проблему?Кстати, когда я делаю то же самое с помощью HashSet (), я не получаю нежелательный эффект.

1 Ответ

1 голос
/ 23 мая 2011

Hashtable работает просто отлично, но нежелательно, его заменили на HashMap в Java 1.2 (1998). Я предлагаю вам не использовать его без необходимости.

public static void main(String... args) {
    Hashtable<MyObject, MyObject> table =
            new Hashtable<MyObject, MyObject>();

    MyObject myObj = new MyObject();
    System.out.println(myObj.hashCode());
    System.out.println(myObj.equals(myObj));

    if (!table.contains(myObj)) {
        System.out.println("OK");
        table.put(myObj, myObj);
    }

    if (!table.contains(myObj)) {
        System.out.println("ERROR");
        System.out.println(table);
    }
}

static class MyObject { }

печатает

1584673689
true
OK

однако лучшим решением было бы использовать карту типа HashMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...