List<Integer> mylist = new ArrayList<Integer>();
ArrayList<Integer> mylist2 = new ArrayList<Integer>();
我想知道在Java集合API中,上述两者的实际区别是什么。我对Java集合API还不熟悉。我知道List是一个接口,而ArrayList类则实现了它。
List<Integer> mylist = new ArrayList<Integer>();
ArrayList<Integer> mylist2 = new ArrayList<Integer>();
我想知道在Java集合API中,上述两者的实际区别是什么。我对Java集合API还不熟悉。我知道List是一个接口,而ArrayList类则实现了它。
List<Integer>
版本是接口类型,它只允许您执行由接口声明的方法,而ArrayList<Interger>
类型的变量允许您执行在ArrayList<Interger>
及其超类中声明的任何操作(当然包括List
)。LinkedList<Interger>
(例如),而不是ArrayList<Interger>
作为动态类型,则可以更轻松地进行更改。
List<Integer>
版本。如果您确实需要使用ArrayList
的确切类型,则应该选择它。一个很好的经验法则是从接口版本开始,并仅在发现您难以使用ArrayList
类型(或者发现自己将其强制转换为ArrayList
时)才将其更改为ArrayList<Integer>
。mylist
表示为List<Integer>
,而它仍然是ArrayList<Integer>
,因此你只能使用List
接口中提供的方法。如果你使用跨类/方法的功能,这是更好的陈述方式。List<Integer>
的方法都可以接受List
的任何实现类,例如LinkedList<Integer>
或你自己的实现类。ArrayList<Integer>
对象。有些人喜欢在方法中仅在本地使用mylist
。始终按接口编码。
(汽车比喻警报)
你走进赫兹租车公司。 你说,我想要一个IVehicle
。 他们说,“好的,什么类型的IVehicle
?” 你不在意。 所以他们给了你一辆DumpTruck
。 但你不想要一辆自卸车,你想要紧凑型的东西。 你想要一个扩展了IVehicle
的ICompact
。 所以他们给了你一辆摩托车。 “不!”你大声喊道,“我想要一辆ICar
!” “什么样的ICar
?”他们问道。 “我不在乎!”你大声喊道。 所以他们给了你一辆FordCar
,然后你就过上了幸福快乐的生活。
这下清楚了吗?
首先是接口编程。
在整个代码中使用 List
引用,您可以将具体实现更新为其他内容,例如 LinkedList
,而不会破坏客户端代码。
你可以把它看作是多态性。
List<Integer> mylist
声明它为 List,但它不一定是 ArrayList - JVM 只知道它实现了 List 接口。
ArrayList<Integer> mylist2
声明它为 ArrayList,因此 JVM 知道它不仅是 List,而且特别是 ArrayList。
对于myList
,您只能调用List
接口的方法。
例如,您不能在myList上调用ensureCapacity
方法。
hashCode()
和toString()
的方法-使用Object
-它将使您以后更容易地重构代码。这在谈论实例和类变量时尤其正确。 - amit