当前位置: 首页 > 面试题库 >

原因-列表列表= new ArrayList();

景鹏云
2023-03-14
问题内容

我已经看过很多次这样的代码:

List<String> list = new ArrayList<String>();

人们为什么选择父ArrayList类(和其他类)而不是生成的对象的类型?

这会降低性能吗?还是为什么有人要这样做?


问题答案:

当某人这样编写代码时,他/她正在尝试遵循基本的OO设计原则,即-

编写接口程序,而不是具体实现

我已经在我的一篇博客文章中解释了这一原理。在该Class Inheritance VS Interface Inheritance部分中查找。

总而言之,当您使用父类型的引用来引用子类型的实例时,您将获得很大的灵活性。例如,如果将来需要更改子类型的实现,则无需更改太多代码即可轻松实现。

考虑以下方法-

public void DoSomeStuff(Super s) {
    s.someMethod();
}

并调用此方法-

DoSomeStuff(new Sub());

现在,如果您需要更改内部逻辑someMethod,则可以通过声明的新子类型(Super例如NewSubType)并更改该实现内部的逻辑来轻松实现。这样,您将无需接触使用该方法的其他现有代码。您仍然可以DoSomeStuff通过以下方式使用您的方法-

DoSomeStuff(new NewSubType());

如果您声明的参数为DoSomeStuffof Sub,那么您也必须更改其实现-

DoSomeStuff(NewSubType s) {
    s.someMethod();
}

并且可能还会链接/冒泡到其他几个地方。

就您的集合示例而言,这使您可以轻松地更改变量指向的列表实现。您可以轻松地使用LinkedList代替ArrayList



 类似资料:
  • 问题内容: 我有一个错误- 选择列表中的“ Employee.EmpID”列无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。 这种情况符合Bill Karwin的回答。 上面的更正,适合ExactaBox的回答- 原始问题- 对于SQL查询- 我不明白为什么会收到此错误。我要做的就是加入表格,然后将特定位置的所有员工分组在一起。 我认为我对自己的问题有部分解释。 告诉我是否还可

  • 问题内容: 有没有办法在Java中创建原始int或任何原始类型的列表,如下所示? 看来我能做到 并将“ int”添加到此列表中。但这意味着我可以在此列表中添加任何内容。 我唯一的选择是创建一个int数组并将其转换为一个列表或创建一个Integer对象的列表吗? 问题答案: 在Java中,任何变量的类型都是原始类型或引用类型。泛型类型参数必须是引用类型。由于基元不扩展,因此它们不能用作参数化类型的泛

  • 问题内容: 在Python中,内置函数和return和分别用于空的可迭代对象。我意识到,如果相反,仍然可以提出这个问题。但我想知道为什么选择了 这种特定 行为。是任意的,即。换一种方式是否一样容易,还是有潜在的原因? (我问的原因仅仅是因为我不记得哪个是哪个,如果我知道背后的原因,那么我可能会发现。还有好奇心。) 问题答案: 怎么样的类比… 您有一个袜子抽屉,但当前为空。它是否包含任何黑色袜子?不

  • 问题内容: 我正在使用java / hibernate / Oracle。我有一个超过3000个条目的列表。如果我通过整个列表,我将获得以下例外。 引起原因:java.sql.SQLException:ORA-01795:列表中的最大表达式数为1000 为了解决此问题,我将列表分为多个子列表,每个子列表将有1000个条目。对于每千个条目,我都会触发一个查询。它工作正常。 请澄清一下,有没有更好的解

  • 我认为我发现了一个错误在运行时的Java与JSF 2.0(使用Primeface),在这个项目中我使用JSF 2.0 Primeface和CDI。 恢复问题,我的业务类Role中有一个方法设置器收到了一个List,但JSF正在设置一个ArrayList。java应该抛出异常还是至少不应该找到匹配的方法?这里是: 该方法的输出为: 当我尝试在foreach中使用这样的: 投掷 你能解释一下这是怎么回

  • 我的DTO中有一个字符串列表,我想把它映射成一个对象列表,在映射器中我使用服务通过这个字符串获取对象,但我有以下错误 考虑声明/实现一个映射方法:“java.util.list map(java.util.list value)”。