为什么大多数示例都使用ArrayList

She*_*ari 6 java android arraylist

开发Java时,您总是了解到最好使用List接口创建ArrayList作为存储列表的变量的类型.像这样

List<String> myList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

但是,通过查看包中包含的很多android示例,他们已经使用Class创建了列表.

ArrayList<String> myList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

这有什么原因吗?是否更快,更轻或明确设置类?

小智 12

我建议阅读Performance Myths,它解释了将变量定义为List或ArrayList的优点和问题.


Mic*_*rdt 10

就个人而言,我认为"你一直学到的东西"错过了重点.这个:

List<String> myList = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

维护效益很小.如果要将其更改为其他实现,则在使用实现类型时仍然只需更改一行.然而,完全不同的是这个:

public void process(List<String> list) {
Run Code Online (Sandbox Code Playgroud)

在这里,使用界面真的很重要,因为它允许调用该方法的人使用不同的实现而无需更改方法签名(他们可能无法做到).


Lie*_*yan 9

在像Android设计的手机这样的资源受限环境中,最好避免使用Interface,因为它涉及额外的虚拟函数调用.

  • 这是谷歌文档节省资源的官方原因.我也称之为过早优化.尽量使用列表界面. (8认同)
  • 我同意.需要有很多构造函数调用来实现这一点.我很想看到一个实用的应用程序,它可以提供足够的性能以获得性能优势.但是我再也没有为Android编程...... (2认同)
  • @Daniel Standage:我认为使用显式类型实际上不会影响构造函数调用; "接口税"(虚拟函数调用)是为每次调用成员函数而支付的.构造函数本身几乎没有受到影响.但是,我同意它需要实际的基准来看看这是否真的仍然重要,因为最新的智能手机具有相当强大的处理器和相当大的内存. (2认同)