我知道我们必须为所有表模型更新操作使用 AWT 线程。在单个 AWT 线程下,任何表模型都是线程安全的。为什么 DefaultTableModel 选择线程安全的 Vector 作为其数据结构,比其他数据结构如 ArrayList 慢?
4 回答
Swing 最早出现在 Java 1.2 之前,所以之前ArrayList
是可用的。不幸的是,APIDefaultTableModel
暴露了它使用 的事实Vector
,因此现在更改它将是向后不兼容的。
这正是仔细考虑封装的原因——它可以让您稍后更改内部结构。(诚然,正确地进行连载会很有趣,但这是另一天的故事......)
Swing 可用于 Java 1.1,但不包含在 Java 1.1 中。List
/ArrayList
在 1.2 中引入。可惜,因为在锁定 API 之前,Swing 本来可以多花一点时间。
原因上面已经解释过了(Swing 在 java.util Collections 库之前就已经存在)。
底线是:永远不要使用DefaultTableModel
,而是构建自己的(基于AbstractTableModel
)。
我猜测DefaultTableModel
该类实际上是在 Java 中引入Collections Framework(包括ArrayList
该类)之前开发的——因此,DefaultTableModel
该类不是使用作为 Collections Framework 的一部分引入的类来实现的。
以下是一些事实:
DefaultTableModel
在 Java 1.2 中引入ArrayList
在 Java 1.2 中引入Vector
在 JDK 1.0 中引入
此外,类使用 aVector
作为底层数据结构DefaultTableModel
是一个实现细节,因为TableModel
接口本身不依赖于 a 的使用Vector
。