我应该使用哪个集合(键值)?

时间:2019-09-23 14:15:15

标签: java android

在我的应用程序中,我有以下课程:

public class Product {
    private String name;
    private float calories;
    ...
}

此外,我还有一份已添加到餐中的产品清单,例如早餐。我将这些产品保存在ArrayList中。

abstract class Meal {

protected float amountCalories;
protected float amountFat;
protected float amountCarbohydrates;
protected float amountProtein;

protected List<Product> listOfProduct = new ArrayList<Product>(); // previously mentioned product list
...   

}

接下来,我需要一个键-值机制,其中键将是用餐日期 而产品清单的价值。哪个收藏最合适,给我带来好处 效率?是HashMap还是其他?

1 个答案:

答案 0 :(得分:3)

我猜您只使用日期,否则,如果它是日期/时间,则将其用作Meal类中的属性会更有效。

要使用相同的键来使用多个食物:

Map<Date, List<Meal>>

您可以使用TreeMapHashMap。两种实现都是Java Collections Framework不可或缺的一部分,并将数据存储为键值对。

  • HashMap按照hashing的原理工作,通常用作存储桶的哈希表,但是当存储桶太大时,它们将转换为TreeNodes的节点,每个节点的结构都类似于Java中的节点。 util.TreeMap。

  • TreeMap扩展了AbstractMap类并实现了NavigableMap接口。 TreeMap将地图元素存储在红黑树中,该树是自平衡二进制搜索树

Performance HashMap

HashMap是基于哈希表的实现,在内部使用基于数组的数据结构根据哈希函数组织其元素。

HashMap为大多数操作(如add(),remove()和contains())提供预期的恒定时间性能O(1)。因此,它比TreeMap快得多。

在合理假设下,在哈希表中搜索元素的平均时间为O(1)。但是,哈希函数的不正确实现可能会导致值在存储桶中分布不均,从而导致:

  • 内存开销–许多存储桶未使用
  • 性能下降–碰撞次数越多,性能越低

性能树图

TreeMap将其数据存储在分层树中,并能够借助自定义比较器对元素进行排序。

其性能摘要:

  • TreeMap对大多数操作(如add(),remove()和contains())提供O(log(n))性能
  • Treemap可以节省内存(与HashMap相比),因为它仅使用保存其项目所需的内存量,这与使用连续内存区域的HashMap不同。
  • 一棵树应该保持平衡以保持其预期的性能,这需要大量的工作,因此使实现复杂化

我们应该在任何时候使用TreeMap:

  • 必须考虑内存限制
  • 我们不知道内存中必须存储多少个项目
  • 我们要以自然顺序提取对象
  • 如果将一贯添加和删除项目
  • 我们愿意接受O(log n)搜索时间
  

查看更多:https://www.baeldung.com/java-treemap-vs-hashmap