简化的集合框架图如下:
List是一个接口:
ArrayList是最常用的一种List的子类(当然也实现了其他接口,也继承了父类)。
ArrayList用法类似于数组,且其容量可按需要动态调整,亦被称为动态数组。
示例:泰国旅行团
本示例展示了在List中使用泛型的必要性。
设定:泰国旅行团,约定只收Girl,有一个Boy混入,编译没问题,接机(输出)时按Girl接收,会出错。
代码没错,运行出错(对象本是Boy类型,偏要转成Girl类型---类型转换异常)
Exception in thread "main"
java.lang.ClassCastException
JDK 1.5之后,引入了泛型,可指定列表内元素的类型。类型不符合的元素不允许加入数组,这样就能再编译阶段发现错误,避免运行时出错的尴尬。
迭代器原理gif:https://www.cnblogs.com/tigerlion/p/10706386.html
Collection相关方法
这些方法属于Collection类,可以被子类继承,因此通用性较强,不仅List能用,Set也能用。
List相关方法
源码浅析:
ArrayList底层是通过数组实现,查询快、增删慢。API文档上说ArrayList不是同步的,即多线程环境下不安全,但是效率高。
ArrayList每次扩容至1.5倍。
和ArrayList用法一致。
Vector是一个比较老的类,在JDK 1.0即已出现,不推荐使用(蓝桥杯的练习题中出现过Vector,在那道题中只要知道它的用法和ArrayList一样就行)。
虽然Vector是线程安全的,但是在线程安全方面也不推荐使用。推荐方案如下:
ArrayList使用数组实现,查询快,增删慢;
LinkedList使用链表实现,查询慢,增删快,适用于经常插入、删除大量数据的场合,适合采用迭代器Iterator遍历。
如果仅仅是在列表末尾插入数据,LinkedList的效率低于ArrayList,因为LinkedList调用add时需要创建对象,而ArrayList只是在容量不够时才扩容。
LinkedList实现了List和Deque(双端队列)接口。
特色方法(此时不能使用多态):
[B, A]
[B, A, A, B]
栈[B, A]
队列[B, C]
- 栈:先进后出
- 队列:先进先出
Deque(双端队列),是Queue的子接口,其实现类ArrayDeque和ArrayList的实现机制相似,使用Object[]数组存储集合元素,当容量不足时,可以重新分配数组。
ArrayDeque可以当做栈和队列使用。
运行结果:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/4795.html