【问题标题】:Class Object vs Hashmap类对象与哈希图
【发布时间】:2012-05-02 17:42:50
【问题描述】:

用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());

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

【问题讨论】:

  • 实际上我正在读取一个 xls 文件,其中包含我的老板要求我通过从 xls 文件 ONE BY ONE 读取数据来更新 oracle 的记录,仅使用对象类的getter 和 setter 代替使用 hashmap 映射所有数据,然后将其传递给 oracle。
  • 对于非印度人,10 万 = 10 万 :-)
  • 如果使用HashMap,那么在Oracle中存储时如何获取值的“类型”? (假设您的电子表格包含多种类型的值,例如字符串、数值等)
  • 首先使用 hashmap 作为 String、String 映射 columns_name 和它们的值......然后只需对它们进行类型转换......
  • 我已经这样做了......我能够更改日期、字符串、数字等......

标签: java class object hashmap


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我有固定的数据要读取,固定位置的列数不固定.....每个值的键也是固定的,因为你可以看到我传递一个固定的字符串数组作为哈希图中的键...而且我不想更改密钥....我知道我将在哪里使用这些密钥....问题是如果它失败了上面的任何事情只需抛出一个错误
    • 然后使用一个对象。如果您不确定 Excel 文件的有效性,请在读取它并创建对象实例之前或同时对其进行验证(例如,检查是否填充了必填单元格)。但是(假设单元格表示人员的字段),处理具有名字、中间名和姓氏的 Person 对象比处理 Map 更具可读性。
    【解决方案3】:

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

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

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

    【讨论】:

    • 嗯...如果问题是“我是否应该在我的域对象中使用 HashMap 属性而不是 A、B 和 C 属性,我不会使用 HashMap。A、B、C 是你的对象的属性,它们不应该仅仅存储在 HashMap 中。
    • 其实就是用hashmap或者一个类来读取和设置数据……然后从中取回……
    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多