30

用hashmap代替对象类好不好…… 用hashmap....

Map<String, String> cellMap = new HashMap<String, String>();
int j = 0;
while (cellIter.hasNext()) 
{
   HSSFCell myCell = (HSSFCell) cellIter.next();
   cellMap.put(columnMap[j], myCell.toString());
   j++;
}

并使用对象类.....

ABC abc= new ABC(); 
abc.setA(myRow.getCell(0).toString());
abc.setB(myRow.getCell(1).toString());
abc.setC(myRow.getCell(2).toString());

请在应用程序运行状况、内存要求等方面告诉我...

4

3 回答 3

40

这在很大程度上取决于您要实现的目标:为了灵活性,哈希映射更好。但灵活性是有代价的:哈希映射也比具有相同数量的强类型字段的类更大且更慢。

  • 哈希映射比具有相同数量字段的类具有更大的内存占用
  • 哈希映射强制对基元进行装箱
  • 哈希映射的创建和访问速度较慢

对可读性也有影响:当您的业务逻辑特定于具有固定数量字段的类时,专用类显然会胜出;当动态配置字段时,哈希表是您唯一的选择。您还可以进行混合设计,当对象在内部使用哈希映射进行存储时,在外部呈现命名良好的字段,并公开语义以随时添加更多“字段”。

总而言之,在您决定使用哈希映射以实现其灵活性之前,您应该确定您是否真的需要设计中的所有灵活性。有时,答案是“是”,有时是“否”;对此没有“一刀切”的解决方案。

于 2012-04-21T10:30:33.357 回答
6

一个对象有字段(数据)和方法(行为)。如果您的数据包含在一组固定的单元格(A、B 和 C)中,那么一定要使用对象。

Java 是一个 OO 对象,OO 设计、封装等可以帮助您构建健壮、可维护和快速的程序。

当您必须关联可变数量的键和值时,映射很有用。但它只是一种数据结构,不允许您封装额外的行为。

例如,您的对象中可能有一个 getAAndB() 方法,它返回与 B 连接的 A。或者您可能有转换或查询字段的方法。或者您可以将 ABC 实例传递给使用它们的其他对象。使用具有明确定义的方法的对象 ABD 比使用Map<String, String>. 地图的键是什么?他们的价值观是什么?它记录在哪里?如果您想更改密钥怎么办?您将如何检测代码中使用这些键的所有位置?

于 2012-04-21T10:31:15.690 回答
4

您应该将其视为性能之前的“设计”问题。无需提前进行过早优化以支持良好的设计。所以,问题是:“你需要通过一个中间集合来填充你的域对象 ABC 吗?” 在大多数情况下,我不会这样做,但如果不了解更大的背景,很难说明确的或明确的不。

更新: 30-40K:记录数与 Object 与 HashMap 比较无关,因为它们将在循环中处理(免责声明:与设计无关,与性能无关)。但是,电子表格中的列数很重要,因为这将直接反映为对象中的属性数。

如果这只是一个数据迁移数据传输练习,那么我会使用 HashMap 方法。假设 ABC 将是一个没有行为的短命、一次性的数据容器对象,则无需创建它。然后我会测试系统的性能,如果它不满足验收标准,那么我会对其进行分析并仅在必要时对其进行优化。

于 2012-04-21T10:29:52.820 回答