Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该使用哪个集合(键值)?_Java_Android - Fatal编程技术网

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

Java 我应该使用哪个集合(键值)?,java,android,Java,Android,在我的申请表中,我有以下类别: public class Product { private String name; private float calories; ... } 此外,我还有一份添加到膳食中的产品列表,例如早餐。我将这些产品保存在ArrayList中 abstract class Meal { protected float amountCalories; protected float amountFat; protected float amou

在我的申请表中,我有以下类别:

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
...   

}
抽象类{
受保护的漂浮热量;
受保护的漂浮脂肪;
受保护的碳水化合物;
保护蛋白;
受保护的产品列表listOfProduct=new ArrayList();//前面提到的产品列表
...   
}
接下来,我需要一个键-值机制,其中键将是用餐日期 而产品列表的价值。哪一款最适合我,给我带来好印象
效率?它是HashMap还是其他什么?

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

要能够使用相同的键使用多顿饭:

Map<Date, List<Meal>>
Map
您可以使用
TreeMap
HashMap
。这两种实现都构成了Java集合框架不可分割的一部分,并将数据存储为键值对

  • HashMap的工作原理是,并且通常充当一个带扣的哈希表,但是当bucket变得太大时,它们会被转换为树节点,每个节点的结构与java.util.TreeMap中的节点类似

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

性能HashMap

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

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

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

  • 内存开销–许多存储桶仍然未使用
  • 性能降级–碰撞次数越高,性能越低
性能树图

树映射将其数据存储在一个层次结构树中,该树能够在自定义比较器的帮助下对元素进行排序

其业绩摘要:

  • TreeMap为大多数操作(如add()、remove()和contains()提供了O(log(n))的性能
  • 树映射可以节省内存(与HashMap相比),因为它只使用保存其项所需的内存量,而HashMap使用连续的内存区域
  • 树应该保持其平衡以保持其预期性能,这需要相当多的工作,因此使实现复杂化
无论何时,我们都应该使用树形图:

  • 必须考虑内存限制
  • 我们不知道需要在内存中存储多少项
  • 我们希望按自然顺序提取对象
  • 是否始终添加和删除项目
  • 我们愿意接受O(logn)搜索时间
请参阅更多:


当你说“关键是吃饭的日期”时,是指时间还是日期?因为如果你只使用日期部分,你每天只能增加一顿饭。根据你提到的,HashMap将是合适的。但是如果你打算在多线程环境中使用它,你可能需要考虑一个并发的HASMAP()。这个键只是时间的一部分,没有时间,我知道我只能添加一顿饭,因为密钥必须是唯一的(从我所记得的)。这就是为什么我创建了抽象的Dine类,它们将继承该类,其他类如:早餐、午餐等。因此每顿饭都有自己的ArrayList和HashMap。我只是不知道HashMap是否是我需要的集合。那么,您是否要在
MEIN
类中定义此HashMap(或任何键值数据结构)?当然,ArrayList将位于MEIN抽象类中,以便每顿饭都有自己的产品列表。但是,HashMap数据结构不会在Dine类的内部,因为它对我来说似乎毫无意义。