Я знаю, что мы должны использовать поток AWT для всех операций обновления модели таблицы. В рамках одного потока AWT любая табличная модель будет потокобезопасной. Почему DefaultTableModel выбирает потокобезопасный вектор в качестве своей структуры данных, который медленнее, чем другие структуры данных, такие как ArrayList?
Почему Java DefaultTableModel использует вектор?
Ответы (4)
Swing впервые появился до Java 1.2, поэтому до того, как ArrayList
стал доступен. К сожалению, API для DefaultTableModel
демонстрирует тот факт, что он использует Vector
, поэтому изменение его сейчас было бы обратной несовместимостью.
Это как раз та причина, по которой следует тщательно обдумывать инкапсуляцию — она позволяет позже изменить внутренности. (Правда, получить правильную сериализацию было бы интересно, но это история для другого дня...)
Swing был доступен для Java 1.1, но не был включен в него. List
/ArrayList
были представлены в версии 1.2. Жаль, потому что Swing мог бы потратить немного больше времени, прежде чем заблокировать API.
Причина уже была объяснена выше (Swing существовал до библиотеки java.util Collections).
Суть такова: никогда не используйте DefaultTableModel
, а лучше создавайте свои собственные (на основе AbstractTableModel
).
Я предполагаю, что DefaultTableModel
a> фактически был разработан до Collection Framework (включая класс ArrayList
) был представлен в Java, поэтому класс DefaultTableModel
не был реализован с использованием классов, представленных как часть The Collections Framework.
Вот несколько фактов:
DefaultTableModel
появился в Java 1.2.ArrayList
появился в Java 1.2.Vector
появился в JDK 1.0.
Кроме того, использование Vector
в качестве базовой структуры данных классом DefaultTableModel
является деталью реализации, поскольку TableModel
не зависит от использования Vector
.