这两个声明有什么不同?

时间:2011-09-03 21:47:46

标签: java

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

ArrayList<String> someName = new ArrayList<String>();
  1. 它会影响性能吗?
  2. 第一个是对象列表,后一个是对象的ArrayList。如果我错了,请纠正我。我很困惑因为ArrayList实现了List Interface。
  3. 为什么人们这样声明?它在任何情况下都有帮助。
  4. 当我从DB收到一些电子邮件地址时,收集它的最佳方式是什么?电子邮件地址列表对象????
  5. 最后一个无关的问题......界面有两个方法名称,名称和签名相同,名称相同,签名不同。

5 个答案:

答案 0 :(得分:6)

声明之间的区别更多是样式。最好使用抽象而不是具体实现来声明变量,因为您可以在以后更改实现选择而不更改变量类型。例如,您可以更改List以使用LinkedList。

如果您总是使用抽象类型(接口或抽象类),尤其是在方法签名中,客户端代码可以自由使用他们喜欢的任何实现。这使代码更灵活,更易于维护。

即使是变量声明也是如此。考虑一下:

public abstract class MyListUsingClass {

    private List<String> list;

    protected MyListUsingClass(List<String> list) {
        this.list = list;
    }

    ...
}

如果变量list被声明为ArrayList,那么构造函数中将只接受 ArrayLists。这将是一个糟糕的选择:总是尝试让客户端代码选择他们想要使用的实现。

关于你的上一个问题:接口对类的方法有相同的限制,所以是的,你可以overload methods

答案 1 :(得分:2)

  1. 没有性能影响,因为在运行时,您在两种情况下都处理相同的类(ArrayList)。
  2. 它们都是字符串列表。不同之处在于,第一个声明作为List但初始化作为ArrayList,这是一种更具体的List类型。
  3. 一个有用的实例是当您使用具有上下文相关建议(Eclipse,NetBeans等)的IDE时。在第一种情况下,无论何时使用建议功能,您都只能看到List接口的成员。在第二个中,您将看到ArrayList的所有(公共)成员。在任何给定的编程情况下,只要更抽象的类型提供您需要的功能,您就希望使用它,因为它使您的代码更健壮:类型越抽象,在将来的某个版本中更改的可能性就越小的API。
  4. 表示任何事物的最佳方式总是取决于您打算使用的数据以及数据量。可能是一个列表或一组javax.mail.internet.InternetAddress符合该法案。
  5. 只有具有不同参数类型签名的接口才能有两个具有相同名称的方法。即使参数具有不同的名称,两个都采用单个字符串的方法也不能具有相同的名称,也不能有两个具有相同名称且仅在返回类型上不同的方法。

答案 2 :(得分:1)

  1. 表现 - 可能不是。
  2. 实际上它们是字符串列表,而不是对象。接口不是Collection
  3. 中的内容
  4. 如果您希望使代码独立于具体列表实现,则定义超类类型的变量可能很有用。如果有一天你想将列表更改为LinkedList实施 - 这对你的所有代码都不会那么有害
  5. 创建新类型的电子邮件并将其存储到某种列表中(例如,提到LinkedListArrayList)或仅存储数组(电子邮件[])。如果您提供更多信息 - 这可能会有所帮助。

  6. 编辑 2.在这两种情况下,它们都是字符串的ArrayList。区别在于,在第一种情况下,您正在进行超类的转换(无法访问特定于ArrayList的某些方法)

答案 3 :(得分:1)

在第一个原因中,您声明了一个var类型列表并使用ArrayList作为其实现。

在第二种情况下,您要声明并定义数组列表。

不同之处在于,使用interface类型(如第一种情况),您将只访问List界面中定义的那些方法,如果ArrayList具有某些特定的方法实现方法,为了访问它们,您需要将列表转换为其子类型(ArrayList)。

在第二种情况下,您使用的是更具体的类型,因此根本不需要强制转换。

答案 4 :(得分:1)

  1. 它会影响性能吗?没有可衡量的影响。您的代码将成为性能问题的根源,而不是像这样的纳米优化。
  2. 第一个是对象列表,后者是对象的ArrayList。如果我错了,请纠正我。我很困惑,因为ArrayList实现了List接口。究竟。您可以为其实现的任何类型分配类引用。
  3. 为什么人们这样声明?它在任何情况下都有帮助。您可能希望的原因是,如果您想要更改实现以使用另一个实现List的具体类,例如链表。
  4. 当我从DB收到一些电子邮件地址时,收集它的最佳方式是什么?电子邮件地址对象列表?定义“最佳”。取决于你将如何使用它们。字符串可能就足够了;或许更好的抽象对你有用。
  5. 最后一个与un相关的问题....接口可以有两个具有相同名称和签名的方法名称以及具有不同签名的相同名称。接口定义签名,而不是实现。您可以使用两个接口来定义相同的签名,但执行时只能有一个实现。如果您有使用void draw()方法的Cowboy和Artist接口,那么实现两者的类将必须决定单个实现将是什么。牛仔不能有一个,而艺术家也不能有,因为接口没有任何实现的概念。