Почему Java DefaultTableModel использует вектор?

Я знаю, что мы должны использовать поток AWT для всех операций обновления модели таблицы. В рамках одного потока AWT любая табличная модель будет потокобезопасной. Почему DefaultTableModel выбирает потокобезопасный вектор в качестве своей структуры данных, который медленнее, чем другие структуры данных, такие как ArrayList?


person user729309    schedule 28.04.2011    source источник
comment
вы измеряли медленнее? Предполагаемая только (неправильная) производительность имеет ровно нулевое влияние на производительность :-)   -  person kleopatra    schedule 28.04.2011


Ответы (4)


Swing впервые появился до Java 1.2, поэтому до того, как ArrayList стал доступен. К сожалению, API для DefaultTableModel демонстрирует тот факт, что он использует Vector, поэтому изменение его сейчас было бы обратной несовместимостью.

Это как раз та причина, по которой следует тщательно обдумывать инкапсуляцию — она позволяет позже изменить внутренности. (Правда, получить правильную сериализацию было бы интересно, но это история для другого дня...)

person Jon Skeet    schedule 28.04.2011

Swing был доступен для Java 1.1, но не был включен в него. List/ArrayList были представлены в версии 1.2. Жаль, потому что Swing мог бы потратить немного больше времени, прежде чем заблокировать API.

person Tom Hawtin - tackline    schedule 28.04.2011

Причина уже была объяснена выше (Swing существовал до библиотеки java.util Collections).

Суть такова: никогда не используйте DefaultTableModel, а лучше создавайте свои собственные (на основе AbstractTableModel).

person jfpoilpret    schedule 28.04.2011
comment
Я не согласен с советом никогда не использовать DefaultTableModel. Изобретайте велосипед с помощью AbstractTableModel только тогда, когда это необходимо. Есть много случаев, когда использование DefaultTableModel не повредит. - person jzd; 28.04.2011
comment
@jzd Ну, если вам нравится определять вектор вектора объекта или объект [][], то это зависит от вас, но вам не хватает безопасности типов и читабельности кода. За всю свою жизнь разработчика Swing я никогда не использовал DefaultTableModel (за исключением глупых примеров кода). Кодировать самостоятельно несложно, а использование GlazedList в целом работает намного лучше. - person jfpoilpret; 28.04.2011
comment
@jzd, @jfpoilpret - в основном дело вкуса, у обоих есть свои плюсы и минусы :-) Нетривиально (для начала) реализовать надежную модель. Большую часть времени это не повредит, только выглядит ооочень ретро, ​​если просто использовать значение по умолчанию. Мой итог: используйте то, что доступно, пока действительно не понадобится пользовательская реализация. - person kleopatra; 28.04.2011
comment
@jzd, я не согласен с вашим советом :) Модель должна содержать данные в пригодном для использования формате, специфичном для предметной области. Вектор различных типов не является подходящим объектом модели. - person MeBigFatGuy; 28.04.2011
comment
@jfpoilpret, я согласен, что если у вас нет массивов объектов или векторов, то DefaultTableModel менее привлекательна. Моя точка зрения, что никогда не используйте, является слишком сильным заявлением. - person jzd; 28.04.2011
comment
@клеопатра. Насколько сложен javabean? Честно говоря, я думаю, что поддерживать объект модели в векторе значительно сложнее, чем java bean. - person MeBigFatGuy; 28.04.2011
comment
@jzd Хорошо, я мог бы сказать, чтобы не использовать его как чуму для собственного здравомыслия ;-) - person jfpoilpret; 28.04.2011
comment
@MeBigFatGuy javabean (кроме того: если вы имеете в виду bean-компонент в соответствии со спецификацией bean-компонентов, а не поврежденную конструкцию, используемую для java на веб-странице) или нет, это не сложно как таковое, это уведомление о том, что большинство пользовательских реализаций ошибаются ;- ) - person kleopatra; 28.04.2011
comment
Я также рекомендую создавать пользовательские модели на основе списка MyObjects (OO-подход), а не использовать вектор векторов объектов (ориентированный на данные подход). Вот простой образец только для чтения, который я написал некоторое время назад: puces-samples.svn.sourceforge.net/viewvc/puces-samples/tags/< /а> - person Puce; 28.04.2011
comment
эй, эй... если многие из нас начнут отказываться от DefaultTableModel и использовать AbstractTableModel, то будьте готовы, что метод RemoveRow не прост! :D - person gumuruh; 11.04.2012

Я предполагаю, что DefaultTableModel фактически был разработан до Collection Framework (включая класс ArrayList) был представлен в Java, поэтому класс DefaultTableModel не был реализован с использованием классов, представленных как часть The Collections Framework.

Вот несколько фактов:

Кроме того, использование Vector в качестве базовой структуры данных классом DefaultTableModel является деталью реализации, поскольку TableModel не зависит от использования Vector.

person coobird    schedule 28.04.2011
comment
Спасибо за ответы на все вопросы. Я хотел бы, чтобы они могли изменить реализацию в более поздней версии. - person user729309; 28.04.2011
comment
@user729309 user729309 На самом деле, я не уверен, что изменение его на ArrayList вместо Vector приведет к значительному увеличению производительности (за исключением случаев, когда у вас много строк, но в этом случае у вас уже есть проблема с производительностью и памятью в любом случае). - person jfpoilpret; 28.04.2011
comment
@jfpoilpret - без измерения это дает ровно нулевое увеличение ;-) - person kleopatra; 28.04.2011