我需要一个“列表”或“地图”,。。。此列表将从另一个ArrayList中添加。当A的参数等于时,对象A被视为等于另一个对象。
我的问题是我只想添加一个列表中不存在的对象。我想知道这两种实施方案之间的区别。使用ArrayList或HashMap
1. ArrayList:
for (A a: source) {if (! (a in ArrayList)) addToArrayList();}
2. HashMap <id, A>
for (A a: source) {hasmap.put (a.id, a)}
哪种方法可以更快地添加大量对象(超过1000个对象,或更多对象)有更好的模式解决我的问题吗???
首先,我要指出这是两种完全不同的数据结构。列表处理元素的线性表示,映射处理键对值。
我的直觉是,你试图在列表和集合之间进行选择。
如果您只想输入唯一的元素,或者更简洁地说,如果您只关心唯一的值,那么某种类型的集是您的最佳选择-如果您不关心排序,可能是哈希集。它为添加、删除、包含和大小等基本操作提供了O(1)时间。
(有趣的是,HashSet
由HashMap
支持,但提供了一个类似于ArrayList
的接口。)
ArrayList对于每个搜索都有O(n)性能,因此对于n个搜索,其性能是O(n^2)。
HashMap
对于每次搜索(平均)具有O(1)性能,因此对于n次搜索,其性能将为O(n)。
虽然HashMap一开始会比较慢,占用更多内存,但对于n的大值,它会更快。
ArrayList性能为O(n)的原因是每次插入都必须检查每个项目,以确保它不在列表中。我们将进行n次插入,因此整个操作都是O(n^2)。
HashMap
具有O(1)性能的原因是散列算法对每个键花费相同的时间,然后查找键也需要恒定的时间。哈希表可能会超过其负载因子并需要重新分配,这就是它在平均水平上保持不变的原因。
最后,为了回答您的问题,我的建议是使用HashMap。
问题内容: 我需要对象A的“列表”或“地图”。…此列表将从另一个ArrayList中添加。当A的参数相等时,认为对象A等于另一个。 我的问题是我只想添加列表中不存在的对象。我不知道在这两种实现方式之间。使用ArrayList或HashMap 哪一个会增加添加大量对象(超过1000个对象或更多对象)的速度更快?我的问题是否有更好的模式??? 问题答案: 首先,我要大胆地指出这是 两个完全不同的数据结
问题内容: Java开发受到压力的一个模因总是使用ArrayList而不是Vector。不推荐使用vector。可能是正确的,但是Vector和Hashtable具有同步的优点。 我正在使用面向大量并发的应用程序,使用像Vector一样同步的对象是否有益?看来他们有自己的位置? 问题答案: Vector和Hashtable的问题在于它们仅在本地同步。它们不会在并发应用程序中中断(就像在损坏的数据中
我想知道Hashmap和ArrayList中的搜索元素有什么比较吗?我遇到的情况如下:我将有少量的元素(通常4-6个,最多10个)。我有这样一个元素的整数id,我将得到很多调用,这些调用将使用Id搜索元素并在这个元素上执行一些方法。这看起来是hashmap的一个很好的用例,但是我开始怀疑像ArrayList这样的线性集合在这里会不会更好。例如因为CPU缓存。为了在地图上使用搜索,我需要自动装箱来从
问题内容: 为什么我们不能总是使用HashMap的原因是什么,即使它在添加,删除操作中比ArrayList或LinkedList效率高得多,也与元素的数量无关。 我用Google搜索它,发现了一些原因,但是始终存在使用HashMap的变通办法,而优势仍然存在。 问题答案: 列表表示元素的顺序。映射用于表示键/值对的集合。 虽然可以将地图用作列表,但这样做有一定的缺点。 维护顺序: -按定义排序列表
问题内容: 有什么方法可以以更高性能的方式使用Standford Tagger? 每次调用NLTK的包装器时,每个分析的字符串都会启动一个新的Java实例,这非常慢,尤其是在使用较大的外语模型时。 http://www.nltk.org/api/nltk.tag.html#module- nltk.tag.stanford 问题答案: 找到了解决方案。可以在servlet模式下运行POS Tagg
嗨, 我正在尝试使用excel中的列标题读取列值(使用java)。如图中所示,假设我想读取标题“城市”、列下的所有后续单元格并显示它们。我该怎么做? 通过查看internet上的示例,我发现大多数示例都使用迭代器在行上迭代。 请不要将此标记为重复,我已经尝试在stackoverflow和internet上搜索,但大多数都使用行迭代。