我知道在通用发布之前会问这个问题。在Array强制执行返回类型的情况下,Array确实胜出一点,它更加类型安全。
但现在,每次我设计这种类型的API时都会使用最新的JDK 7:
public String[] getElements(String type)
vs
public List<String> getElements(String type)
我总是在努力想出一些很好的理由让A Collection over An Array或者其他方式。在选择String []或List作为API的返回类型时,最佳做法是什么?或者它是马匹的课程。
我脑子里没有特殊情况,我更多的是寻找一般的利弊比较。
答案 0 :(得分:13)
如果您正在编写公共API,那么您的客户通常会更喜欢集合,因为它们更容易操作并与代码库的其余部分集成。另一方面,如果您希望在高度性能敏感的上下文中使用公共API,则首选原始数组。
如果您正在编写此内容供自己使用,最佳做法是从集合类型开始,只有在涉及它的确定性能问题时才切换到数组。
可以在运行时通过反射确定数组的元素类型,因此如果该特定功能对您很重要,那么优先选择数组将是另一种情况。
答案 1 :(得分:9)
这是部分列表
数组的优点:
列表的优点:
hashCode()
,equals()
- 如果将基于哈希的集合作为密钥提供,这可能是至关重要的。类型安全:
String[] arr1 = new String[5];
Object[] arr2 = arr1;
arr2[0] = new Object(); //run time error :(
List<String> list1 = new LinkedList<String>();
List<Object> list2 = list1; //compilation error :)
答案 2 :(得分:3)
如果我有一个选择,我会选择Collection,因为我在Java中获得了“免费”的添加行为。
实施接口
最大的好处是,如果您返回Collection API(甚至是List,Set等),您可以轻松更改实现(例如ArrayList,LinkedList,HashSet等),而无需使用该方法更改客户端。
添加行为
Java Collections类提供了许多可应用于集合的包装器,包括
答案 3 :(得分:0)
当您公开公共API时,返回Collection非常有意义,因为它通过使用其上可用的各种方法使客户端的生活更轻松。如果想要特殊情况的数组表示,客户端总是可以调用toArray()
。
与其他模块的集成变得更加容易,因为大多数API都期望收集,因此也可以工作。
答案 4 :(得分:0)
在我看来,它取决于返回值的用途。
如果返回的值将被迭代而没有其他内容,则数组是最佳选择,但如果结果将被操作,则转到相应的Collection。
但要小心,因为,例如,List应该允许重复,而Set不应该,Stack应该是LIFO而Queue应该是FIFO并注意我应该使用的,因为只有实现可以确定真实的行为。
无论如何,这实际上取决于。