(一)集合概念:用于存储多个对象的单一对象(容器),存储的数据叫元素.元素都是引用类型
PS:容器内存储的都是对象的地址;
用于模拟现实生活中的容器,因此集合类型,不单是一种,有很多类型设计成各种存储的数据结构,这种类型叫做集合框架
元素:必须是引用数据类型的数据,不能是基本数据类型的数据,可以是包装类
JDK1.5新特性:
1.5前容器可以存储Object的任何子类型,但是在对元素进行操作时,比如在调用元素的方法时,我们必须知道冤死的类型,所以在编程中增加了大量代码,来强制转换,增加了开发难度,因此1.5开始支持了一个新特性,叫泛型机制,用来规定容器中存储的元素类型,此机制可以在编译期间判断元素的类型
(二)集合与数组的区别:
数组:可以存储基本数据类型,也可以存储引用数据类型
集合:只能存储引用数据类型
(三)集合框架中包含多种接口,抽象类,实现类等,用此来满足我们所需要的用于存储数据的数据结构
(四)Collection接口和Collections类:
Collection是集合框架的顶级父接口,用来定义常用的抽象方法,子类需要实现相应的方法逻辑
Collections是集合的工具类,定义了许多用于操作集合的工厂方法
常用方法:
boolean add(E e):
将对象e添加到容器(集合)中
int size();
返回集合元素的个数
boolean addAll(Collection c):
将集合c添加到此集合中
void clear();
清空集合元素
boolean contains(Object obj):
查看此集合中是否包含obj这个元素
boolean containsAll(Collection> c)
如果此集合包含集合c中的所有元素,则返回true。反之,false
boolean isEmpty():
判断集合是否为空
boolean remove(Object o):
从该集合中删除指定元素的单个实例
boolean retainAll(Collection> c):
仅保留此集合中包含在指定集合中的元素(可选操作)。
(五)子接口:List与Set,Queue
1.List接口: 列表
此接口对应的实现类的特点都是:有序的,可重复的
有序:存储时与添加的顺序有关,有对应的下标标记位置
重复:存储的对象可以是同一个,或是内容相同的不同对象,重复与否与元素的equals方法有关
常用方法:
void add(int index, E element):
将指定的元素插入此列表中的指定位置(可选操作)。
E get(int index):
返回此列表中指定位置(下标为index)的元素。
int indexOf(Object o):
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
E set(int index, E element)
用指定的元素element替换此列表中指定位置(index)的元素。返回原元素
E remove(int index)
删除该列表中指定位置的元素。
List subList(int fromIndex, int toIndex)
返回此列表中指定的[fromIndex, toIndex)之间的子集合。
PS:此方法在堆中会产生新集合对象,引用原集合的一部分,修改该集合会影响原集合
/*创建一个集合存储1,2,3,4,5,6,7,8,9,10*/
List list = new ArrayList();
for(int i=0;i<10;i++){
list.add(i+1);
}
System.out.println(list);
/*截取[4,5,6,7,8]*/
List sub = list.subList(3, 8);
System.out.println(sub);
/*将sub集合中的元素分别扩大10倍*/
for(int i=0;i<sub.size();i++){
sub.set(i, sub.get(i)*10);
}
System.out.println(sub);//[40, 50, 60, 70, 80]
System.out.println(list);
//[1, 2, 3, 40, 50, 60, 70, 80, 9, 10]
int lastIndexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
(六)数组与集合之间的转换
1.集合转数组
Object[] toArray();
E[] toArray(E[] e);
2.数组转集合
Arrays工具类的
List asList(数组)
PS:数组转成的集合不能进行增删操作,会出现UnsupportedOperationException异常,可以进行替换操作,但原数组的对应元素也会被替换,想要成功操作,需定义一个新的集合将转换的集合的元素都存入到新集合中
(七)Iterator:迭代器接口
1.迭代器的作用是用来遍历集合元素,是一个接口,Collection继承了该接口,提供了一个方法Iterator iterator()
2.Collection的实现类使用内部类定义了迭代器子类
3.迭代器提供了统一的方法用于遍历集合元素
常用方法:
boolean hasNext();
判断集合中是否有下一个元素
E next();
取出集合中下一个元素
remove();
要移除原集合的元素,调用集合的方法会出现运行时异常,这时需用到迭代器的移除方法
增强for循环--foreach循环
for(数组元素类型 变量:要遍历的集合或数组){
循环体;
}
与经典for循环的区别:
(1)增强for循环中无法使用下标;
(2)经典for循环可以使用下标,和下标有关的逻辑
(八)List的三个实现类
1.ArrayList:
底层是基于动态数组的数据结构,是有存放顺序的
2.LinkedList
底层是基于双链表的数据结构,每一个存储单元都涉及到其他两个引用
优缺点:
在执行get/set时,ArrayList效率高,LinkedList效率低
在增加,删除时,LinkedList效率高,ArrayList效率低
PS:当然在元素的数量大时,效率高低才区别显著
3.Vector:是一个比较古老的集合类型,线程安全但效率低,故不建议使用
(九)接口Queue:队列,先进先出
Queue也是Collection的子接口,一种队列的数据结构
队列:通常都是一端进(offer),另一端出(poll)
因为队列增删频繁,所以使用LinkedList实现了Queue接口
常用方法:
boolean offer(E e)
将指定的元素添加为此列表最后一个元素。
E poll()
检索并删除此列表的头一个元素。
队列没有元素时,返回null
E peek()
检索但不删除此列表的第一个元素。
队列没有元素时,返回null
注意:为避免移除队列的队首时出现null,最好先查看队首是不是null
Deque:是一个Queue子接口,实现的是双端队列的数据结构
双端队列:两端都可以进出
E peekFirst()
检索,但不删除,此deque的第一个元素,或返回 null如果这个deque是空的。
E peekLast()
检索但不删除此deque的最后一个元素,如果此deque为空,则返回 null 。
E pollFirst()
检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。
E pollLast()
检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。
模拟栈的数据结构:先进后出
将双端队列的一端进行禁止操作,另一端进出,即Stack
void push(E e)
将元素e进栈
E pop();
将最后进去的元素出栈