【问题标题】:Java tablemodel hashmap vs listJava tablemodel hashmap vs list
【发布时间】:2014-01-28 16:43:49
【问题描述】:

我有一个自定义AbstractTableModel

该模型将数据存储在HashMap 中。所以对于我getValueAt(int rowIndex, int columnIndex)的方法

我愿意

new ArrayList<Object>(data.values()).get(index);

但是,我的数据有超过 2000 个条目,因此每当我必须为我的表获取数据时,每次都这样做会造成巨大的性能损失。

那么您可以推荐什么解决方案?

我是否应该尝试使用List 来存储我的所有数据而不是HashMap
在使用表模型时存储数据的公认标准是什么?

感谢任何人的建议,对于这个可能是个愚蠢的问题,我表示歉意,但对于表格以及如何在表格中存储数据,我并不是很擅长。

【问题讨论】:

    标签: java jtable hashmap tablemodel lis


    【解决方案1】:

    HashMap 通常不适合表模型,因为表需要能够访问行/列位置的数据。

    ArrayListArrayLists 是存储表模型的合理方式。这仍然可以让您快速访问。获取特定行是一个恒定时间查找,然后获取列也是一个恒定时间查找。

    如果您不想要列表的开销,您始终可以将数据存储在二维数组中。

    【讨论】:

      【解决方案2】:

      是的,你看到的代码在性能方面会很糟糕 - 对于你渲染的每个单元格,你正在根据你的 Map 中的值创建一个新的 ArrayList(你可以做数学)。

      至少,可能在表模型的构造函数中创建一次列表,就像这样(假设你有一些你在问题中没有提到的任意对象,作为地图):

      public class MyTableModel extends AbstractTableModel
      {
        private static final int COLUMN_0 = 0;
        private static final int COLUMN_1 = 1;
      
        private List<MyObject> data;
      
        public MyTableModel(Map<?, MyObject> data)
        {
          this.data = new ArrayList<MyObject>(data.values());
        }
      
        public Object getValueAt(int rowIndex, int columnIndex)
        {
          switch (columnIndex)
          {
            case COLUMN_0: return this.data.get(rowIndex).getColumn0();
            case COLUMN_1: return this.data.get(rowIndex).getColumn1();
            ...
            case COLUMN_N: return this.data.get(rowIndex).getColumnN();
          }
      
           throw new IllegalStateException("Unhandled column index: " + columnIndex);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 2011-04-11
        • 2015-04-13
        • 2015-02-05
        • 2014-09-15
        相关资源
        最近更新 更多