为什么Java DefaultTableModel使用Vector?

为什么Java DefaultTableModel使用Vector?,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我知道所有表模型更新操作都必须使用AWT线程。在单个AWT线程下,任何表模型都是线程安全的。为什么DefaultTableModel选择线程安全向量作为其数据结构,这比ArrayList等其他数据结构要慢?Swing适用于Java 1.1,但未包含在Java 1.1中列表/数组列表在1.2中引入。遗憾的是,因为Swing在锁定API之前可能需要一些额外的时间。Swing最初出现在Java1.2之前,所以在ArrayList可用之前。不幸的是,DefaultTableModel的API暴露了它使用

我知道所有表模型更新操作都必须使用AWT线程。在单个AWT线程下,任何表模型都是线程安全的。为什么DefaultTableModel选择线程安全向量作为其数据结构,这比ArrayList等其他数据结构要慢?

Swing适用于Java 1.1,但未包含在Java 1.1中<代码>列表/
数组列表
在1.2中引入。遗憾的是,因为Swing在锁定API之前可能需要一些额外的时间。

Swing最初出现在Java1.2之前,所以在
ArrayList可用之前。不幸的是,
DefaultTableModel
的API暴露了它使用
Vector
的事实,因此现在更改它将是向后不兼容的


这正是仔细考虑封装的原因——它允许您稍后更改内部结构。(无可否认,获得正确的序列化是很有趣的,但这是另一天的故事…

我想该类实际上是在Java引入之前开发的(包括该类)——因此,
DefaultTableModel
类未使用集合框架中引入的类实现

以下是一些事实:

  • 是在Java1.2中引入的
  • 是在Java1.2中引入的
  • 是在JDK1.0中引入的

此外,
DefaultTableModel
类将
向量
用作底层数据结构是一个实现细节,因为接口本身不依赖于
向量

的使用,上面已经解释了原因(Swing在java.util集合库之前就存在)


底线是:永远不要使用
DefaultTableModel
,而是构建自己的(基于
AbstractTableModel
)。

我不同意永远不要使用DefaultTableModel的建议。只有在必要时才可以使用AbstractTableModel重新发明轮子。有很多情况下,使用DefaultTableModel不会有什么坏处。@jzd好吧,如果你喜欢定义一个对象向量的向量或一个对象[],那就由你决定,但你缺乏类型安全性和代码可读性。在我的Swing开发者生涯中,我从未使用过DefaultTableModel(除了愚蠢的代码示例)。编写您自己的代码很简单,而使用GlazedList可以做得更好。@jzd,@jfpoilpret-主要是一个品味问题,两者都有优点和缺点:-)实现一个健壮的模型(对于初学者来说)并不简单。大多数情况下,它不会造成伤害,只是看起来很简单,只是简单地使用默认值。我的底线是:在真正需要自定义实现之前,使用可用的数据。@jzd,我不同意你的建议:)模型应该包含可用的特定于域的格式的数据。不同类型的向量不是合适的模型对象。@jfpoilpret,我同意如果没有对象数组或向量,那么DefaultTableModel就不那么吸引人了。我的观点“永远不要使用”是一个太强烈的陈述。谢谢所有的答案。我希望他们能在以后的版本中更改实现。@user729309事实上,我不确定将其更改为ArrayList而不是Vector是否会带来性能的显著提高(除非您有大量行,但在这种情况下,您已经存在性能和内存问题).@jfpoilpret-未经测量,它会带来零增长;-)你测量过“慢”吗?仅假设(错误)性能对性能的影响为零:-)