通过他们实现的接口初始化HashMap和ArrayList

Initializing HashMap and ArrayList by the interface they implement

所以我的 Java 学校导师刚开始教我们有关容器的知识,但有一个关于初始化的小概念我不明白。

首先, 对于ArrayList,这两种初始化方式有什么区别:

ArrayList list = new ArrayList();

ArrayList<Car> list = new ArrayList<Car>();

其次, 这两种初始化方式有什么区别:

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

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

或者:

Set<String> list = new HashSet<String>();

HashSet<String> list = new HashSet<String>();

或者:

Map<Integer, String> list = new HashMap<Integer, String>();

HashMap<Integer, String> list = new HashMap<Integer, String>();

P.S。当我问有什么区别时,我的意思是这将如何影响我在集合上使用某些方法或移动存储在其中的数据的自由。

谢谢!!

ArrayList list = new ArrayList();
ArrayList<Car> list = new ArrayList<Car>();

第一个没有指定类型(或称为原始类型),不再被认为是好的做法。始终指定列表包含的对象类型。通过这样做,编译器将帮助您在编译时而不是 运行 时发现代码中的某些错误。

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

首先将实例分配给List接口,该接口已由ArrayListclass实现。第二个是 class 本身。建议在 class 上使用接口,除非您需要接口没有的方法。如果您指定接口,则可以更轻松地更改为其他实现。

Set<String> list = new HashSet<String>();
HashSet<String> list = new HashSet<String>();

与列表相同。 SetHashSet实现的接口。

Map<Integer, String> list = new HashMap<Integer, String>();
HashMap<Integer, String> list = new HashMap<Integer, String>();

同上。

此外,一个实现可以实现多个接口。并且您始终可以将实现的实例分配给任何这些接口。但是,当您使用这样的赋值时,只有该接口的方法是可见的。