Collections 以下方法在集合中的区别是什么

Collections 以下方法在集合中的区别是什么,collections,Collections,方法一:通过基类的引用创建子类的对象。 方法二:通过对同一类的引用创建子类的对象 List<Point> objOne = new ArrayList<Point>(); ArrayList<Point> objTwo = new ArrayList<Point>(); List objOne=new ArrayList(); ArrayList objTwo=新的ArrayList(); 列表甚至是一个界面。它更加抽象,精确地定义了API属性,

方法一:通过基类的引用创建子类的对象。 方法二:通过对同一类的引用创建子类的对象

List<Point> objOne = new ArrayList<Point>();
ArrayList<Point> objTwo = new ArrayList<Point>();
List objOne=new ArrayList();
ArrayList objTwo=新的ArrayList();

列表甚至是一个界面。它更加抽象,精确地定义了API属性,但并没有更多。Java中的实现可能有所不同:ArrayList用于批量工作,LinkedList仅用于少量工作,节省内存。这个实施决策应该隐藏起来

函数应该在列表上操作,而不是在特定的实现上操作,比如ArrayList。如果我们谈论的是列表而不是数组列表,那么它的表述也更为普遍。所以对于变量,我也不会过度指定它们的类型

在许多(脚本)语言(如VB、PHP和其他语言)中,这种区别并不存在,只有一种类型和一种实现。这简化了他们的语言,可能会吸引一些人,但Java有很好的技术方面


您可以使用不同的实现,使用工厂方法动态选择一个实现。在单元测试中模拟实现。

列表是一个接口,而ArrayList是一个类。 因此,让我们假设您的同事编写了一个函数,该函数接收点列表并对其进行一些处理。 现在他使用了这样的抽象,这样他的代码既可以在ArrayList上工作,也可以在LinkedList上工作

public void myfunction(List<Point> pointlist){
//do something on the point
}
public void myfunction(列表点列表){
//做点正题
}
现在,您的第一个对象objOne将使用此函数,因为它使用了抽象。这就是编写好代码的方式


现在,您的第二个对象objTwo将无法使用此函数,因此应避免使用此类代码。

您的意思是
myfunction(ArrayList…
将无法工作,这是一个很好的参数。@Sanjay还有其他原因吗?@JoopEggen我从未说过myfunction(ArrayList…)无法工作。我说过,当接口可用时,如果函数有硬类作为参数,那将是一个糟糕的设计。@sanjay我表达得不太好,但理解得很好。