Java集合实现(例如HashMaps vs HashSet vs HashTable ......),选择错误的成本是多少?

Eth*_*man 6 java collections hashmap

在我的代码中,我默认使用ArrayList表示所有列表,HashMap表示所有映射,HashSet表示所有集合.

从实际角度来看,通过选择错误的实现,我在灵活性,可伸缩性,可读性和性能方面失去了多少?什么时候花时间决定使用一个而不是另一个?

我当然看到一个非常明确的案例,说明为什么有人会在某些情况下使用LinkedList而不是ArrayList.什么时候有人认为它是关键的,他们使用的是HashMap而不是TreeMap或HashTable?套装怎么样?

问题:

  1. 选择不好的成本是多少?
  2. 有没有人有关于选择错误的实现和数据中心着火的灾难故事?
  3. 有什么好的经验法则吗?
  4. 是否有任何模糊的集合实现,你不能没有?

我读过:

我从理论的角度发现这个问题是有关系的,但我对现实世界更感兴趣,在战壕里回答.

Tom*_*Tom 7

这是一个非常普遍的问题,但我会提出几个问题.

如果您是面向接口的编程,那么灵活性不会受到重创.例如

void foo(List<E> list);
Run Code Online (Sandbox Code Playgroud)

选择不佳的成本可以从绩效惩罚中看出来.例如,当您正在寻找直接访问时(如在ArrayList中),选择LinkedList.

集合有一个类似的问题.如果你想保持排序的集合没有重复,那么SortedSet将是一个比HashSet更明智的选择.在后者中,您必须手动对整个Set进行排序(这是对Collections.sort()的调用)

<EDIT>

至于地图,有很多不同的实现.每个人都有不同的目的.例如,SortedMap,与SortedSet类似.然后,WeakHashMap不像HashMap那样工作,因为垃圾收集器可以删除密钥.可以想象,HashMap和WeakHashMap之间的选择并不简单.一如既往,取决于您希望与他们一起实施的内容.

</EDIT>

关于故事,在我当前的项目中,我们用SortedSet替换了HashSet,因为性能受到了影响.DataCenter虽然没有起火.

我的两分钱.