四、List接口
List集合代表一个有序集合,集合中的每个元素都有其对应的唯一的索引,List集合允许添加重复元素,可以通过索引来访问对应的元素
List作为Collection的子接口,Collection接口中的方法全部都能使用
1.ArrayList
特点:
a.不排重【同一个元素,可以重复添加多次】
b.有序的【元素的添加顺序和底层存储顺序是相同的】
c.底层存储采用的数据结构是:数组【查询和修改的效率较高,新增和删除的效率较低】
总结:
a.ArrayList底层维护了一个数组,在初始化的时候,数组的长度是10
b.通过调用集合的add方法来添加元素,如果刚开始初始化的数组被添加到满载之后,会自动增长数组的长度【length,原长度的1.5倍】,放到新的数组
c.ArrayList是线程不安全的,所以效率高,并且进行查询或者修改的效率高,新增和删除的效率低【在新增或者删除的时候都会涉及到数组的长度的改变】
d.以后在实际开发中,ArrayList是使用频率最广的一个集合
2.LinkedList
特点:
a.不排重
b.有序的
c.底层存储采用的数据结构是:链表【查询和修改的效率较低,新增和删除的效率较高】
总结:
a.LinkedList中存储的元素在内存中的地址是不连续的,需要让上一个元素记住下一个元素,所以每个元素中保存的不仅有自己的数值,还有下一个元素的地址,虽然也有索引,但是,每查找一个元素,都需要从头开始
b.查询和修改的时候,都需要一个一个的遍历,所以查询和修改的效率相对较低
ArrayList和LinkedList之间的区别:
a.相同点:不排重的,有序的
b.ArrayLIst底层存储采用的是动态数组,允许直接使用索引来访问指定的元素,但是,插入或者删除涉及到数组的长度的改变,效率低
c.LinkedList按照索引需要从头或者从尾部进行查找【遍历】,但是插入数据,只需要记录要插入数据的前后项,插入效率高
3.Vector
特点:
a.在用法上和ArrayList完全相同
b.底层存储采用的数据结构仍然是数组
c.Vector是一个古老的集合,从JDK1.0就有了【从JDK1.4之后,整个集合形成了集合框架,Vector中的方法方法名都比较长,addElement()相当于add()】
d.Vector是线程安全的,ArrayList是线程不安全的【Collections工具类中有相应的方法可以将其同步成安全的】
e.Vector性能比ArrayList低,推荐使用ArrayList
4.Stack
是Vector类的子类,用于模拟“栈”这种数据结构【栈通常是先进后出的容器】
push:进栈
pop:出栈
最后push进栈的元素,最先被pop出栈
特点:
a.不排重的
b.有序的
c.底层存储采用的数据结构是:栈
5.集合的遍历
a.简单for循环
适用范围:只能针对ArrayList和LinkedList
b.增强for循环
适用范围:所有集合
c.迭代器Iterator
适用范围:所有集合
d.ListIterator
适用范围:只适用于List集合