我有一个Web应用程序,它广泛使用ArrayList's
来存储和操作自身内部的数据。但是,最近我明白HashMap's
可能是更好的选择。任何人都可以告诉我从两者中添加,访问和删除元素的算法成本(Big O(n)
)究竟是什么,以及为了提高效率而进入代码并更改它们是否明智?
答案 0 :(得分:8)
对于ArrayList:
运行size,isEmpty,get,set,iterator和listIterator操作 在恒定的时间。添加操作以分摊的常量时间运行, 也就是说,添加n个元素需要O(n)时间。所有其他的 操作以线性时间运行(粗略地说)。不变因素 与LinkedList实现相比较低。
从文档中: http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html
对于HashMap:
此实现为基本提供了恒定时间性能 操作(获取和放置),假设散列函数分散了 桶中的元素恰到好处。迭代集合视图 需要与HashMap实例的“容量”成比例的时间 (桶数)加上其大小(键值的数量 映射)。因此,不设置初始容量非常重要 如果迭代性能是太高(或负载因子太低) 重要的。
从文档中: http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html
答案 1 :(得分:1)
ArrayList的文档讨论了这些操作的性能。对于HashMap
,所有三个都是O(1)
。但是,这确实假设您的hashCode
方法已得到很好的实施,并且也是O(1)
。
答案 2 :(得分:1)
请查看http://www.coderfriendly.com/wp-content/uploads/2009/05/java_collections_v2.pdf