Дублируйте Java Hashtable - PullRequest
       9

Дублируйте Java Hashtable

0 голосов
/ 08 февраля 2011

У меня есть вопрос о дубликатах хеш-таблиц в Java (возможно, дубликаты коллекций Java).

В моем хеш-таблице есть такие пары:Значение: Объекты типа C

C выглядят так:

public interface A extends Cloneable, Serializable{...}

public abstract class B implements A{...}

public class C extends B{...}

Я хочу скопировать эту хеш-таблицу в другую переменную с таким же содержимым, используя new Hashtable(Map t).Мой вопрос: каковы условия для объектов значения для выполнения этой операции?Могу ли я использовать конструктор Hashtable для этого?

Я могу использовать SerializationUtils.clone для значений, но выполнение занимает слишком много времени.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 08 февраля 2011

Если вам не нужна глубокая копия, тогда использование new Hashtable(Map t) должно работать нормально.

SerializationUtils.clone() сериализует и десериализует весь объект-граф, на который ссылается Map, поэтому это занимает так много времени. Однако он создает настоящую глубокую копию (при условии, что в ваших классах нет забавных сериализаций).

1 голос
/ 08 февраля 2011

Если ваш класс C или один из его интерфейсов также предоставляет общедоступный метод .clone() (и он действительно делает то, что вы хотите для отдельных C объектов), простой способ без сериализации будет такой (использование HashMap вместо Hashtable , но здесь это не имеет значения):

/**
 * deeply clones a Map by cloning all the values.
 */
public Map<String,C> deepCopy(Map<String, C> original) {
    Map<String, C> copy = new HashMap<String, C>(original.size());
    for(Map.Entry<String, C> entry : original.entries()) {
        copy.put(entry.getKey(), entry.getValue().clone());
    }
}
0 голосов
/ 08 февраля 2011

Вы можете использовать new Hashtable(Map t), просто имейте в виду, что второй Hashtable будет содержать те же экземпляры, что и первый (не копии объектов) ...

И, кстати, вы должны рассмотреть возможность использования HashMap вместо Hashtable, Hashtable - это более старый класс, который синхронизируется, где HashMap является несинхронизированным эквивалентом, другое отличие в том, что HashMap также допускает нулевое значение ...

...