Java和Android中,HashMap与POJO(Getter Setter,Model Class)哪个更好?

6

在某些情况下,我当时接受了手术。

我们可以将HashMap或Model Class(POJO)作为ArrayList泛型使用,例如ArrayList<HashMap<K,V>>() OR ArrayList<ModelName>()

你能建议我从内存和性能的角度来看,哪个更好呢?

我知道两者都各有优劣,但我想知道如果我有两个备选项...哪一个会更好呢?

例如,假设我有两个变量,都是POJO类中的字符串,也是HashMap中的字符串。

因此,我们有像这样的列表对象...

  final  ArrayList<Abc> listAbc = new ArrayList<Abc>();

 for(final int i=0;i<2;i++){
    Abc modelAbc = new Abc();
    abc.setName("name");
    abc.setLastName("lastName");
    listAbc.add(modelAbc);
  }

在这种情况下,我需要使用两个ABC类对象,并在HashMap中使用List对象,它将...
final ArrayList<HashMap<String,String>> listMap = new ArrayList<HashMap<String,String>>();

for(final int i=0;i<2;i++){
 HashMap<String,String> hashAbc = new HashMap<String,String>();
 hashAbc.put("NAME","firstName");
 hashAbc.put("LASTNAME","lastName");
 listMap.add(hashAbc);
}

在这种情况下,我需要使用两个HashMap对象。
现在告诉我为了更好的性能我应该使用哪一个?哪一个占用更高的内存?

这取决于您的使用情况。请解释具体任务。 - AlexR
1
http://yojava.wordpress.com/2011/06/17/why-i-prefer-pojos-to-maps-for-domain-objects/ - user3145373 ツ
1
你的问题不够清晰。HashMap和POJO是不能相互比较的。请详细说明你的使用情况以澄清问题。 - Santosh
1
我觉得你更多地是在指Java Bean而不是POJO。 - Pablo Lozano
1
如果你担心POJO/Bean与Map的比较性能,那么很可能你正在考虑错误的事情。它们唯一共同的属性是它们允许存储和访问一些属性/值对。它们以不同的方式存储这些“对”,因此内存消耗和访问性能会有所不同。您应该了解(哈希)Map及其内部工作原理。然后您就会意识到Map的性能将取决于您放入Map中的实际键... - Germann Arlington
显示剩余4条评论
2个回答

5
通常,您可以使用集合(List、Map、Set)来存储具有类似特征的对象,这就是泛型存在的原因。因此,如果使用Map来存储多个类的对象,则在获取对象时需要对每个存储的对象进行转换,这不是我们可以编写的最清晰的代码。而且,即使使用HashMap,在使用hashCode值轻松获取对象的情况下,访问速度也比访问Java Bean属性慢...而且您必须始终确保这些对象具有良好的hashCode()生成器。但无论如何,我无法想象这在常规应用程序中何时会成为性能瓶颈。
所以,我的建议是,每当您知道在编译时要存储多少个属性及其类时,请使用Java Bean,并使用Map来存储相同类的元素。
例如,如果您有一个带有用户的DB表,并且您想要“缓存”用户以快速访问其中任何一个,则可以执行以下操作:
class User {
    long id;
    String name;
    ... //other attributes

   //setters and getters
}

然后将它们存储在Map中,以便通过它们的ID快速访问:

Map<Long,User> usersMap= new HashMap<>();
...
usersMap.put(user.getId(),user);

如果不使用多个原始属性(就像我们在POJO中看到的那样),而是只有一个属性,它是一个地图的地图的地图的列表,怎么样? - cs_pupil
我认为这个回答解答了我的问题:https://softwareengineering.stackexchange.com/a/130000 - cs_pupil

0
我会认为快速查找不是您的用例,因为您使用Map的方式无法在O(1)中按名称查找。
此外,这是一种浪费空间的做法,因为您正在创建一个新地图来存储每个名称=值对条目。
我建议如果您有一些唯一的键可用(例如整数ID),则将结构存储在HashMap中,如下所示:
Map<Integer, Model> m = new HashMap<Integer, Model>();

现在这个可以用于快速查找,同时存储您的模型的所有属性。您可以始终使用m.values()方法访问所有模型对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接