由于不同的数据结构(存储方式,数据的组织),java提供了不同的集合
不同的集合功能都是相似的,由于功能相似就向上提取,
将共性抽取出来,这就是集合体系结构形成的原因.
如何学习一个体系结构?
从最顶层开始学习,因为最顶层包含了所有的共性
从最底层使用.最底层为实现
Collection:
Collection层次结构的根接口
boolean add(E e);添加元素,(ArrayList永远可以添加成功,它允许重复)
void clear();清空集合
boolean contains();是否包含元素
boolean isEmpty();是否为空
boolean remove();删除指定元素,并返回是否删除成功
int size();集合元素个数
Object[] toArray:将集合转换成Object数组(遍历集合)
多态:父类引用指向子类对象
Iterator:
迭代器
boolean hasNext();有元素就返回true;
E next();返回下一个元素
remove();
ConcurrentModificationException:并发修改异常
迭代器在获取集合元素时发现集合不一样就会报此异常
比如在用迭代器遍历集合的同时在集合中添加新的元素就会报此错
解决方法:
在使用迭代器遍历的时候使用迭代器进行修改
使用ListIterator中的add方法,此时集合也应改为List集合
泛型:
由于集合可以存储任意对象的类型,当存储了不同类型的对象,就有可能在转换的时候出现类型转换异常
泛型是一种广泛的类型,把明确的数据类型的工作提前到了编译时期,借鉴了数组的特点
泛型避免了类型转换的问题,可以减少警告,可以简化代码的书写.
什么时候使用泛型?
接口名或者类名后有<E>时可以使用泛型
foreach:
增强for 一般用于遍历集合或者数组
for(元素类型变量 : 集合或者数组对象){
直接使用元素类型变量;
}
在使用增强for的同时不能修改集合,否则会出现并发修改异常
ConcurrentModificationException
原因就是增强for的底层就是迭代器
什么时候使用增强for?
实现了iterable接口的就可以使用foreach
常见的数据结构:
数组: 数组的长度一旦定义就不能改变
数组中的元素都有整数的索引
数组只能存储同一类型的元素
数组既可以存储基本数据类型,也可以存储引用数据类型
链表:
可以理解为由铁链连起来的节点,分3部分
1.结点的地址值 2.本结点的值 3.下一个结点的地址值
如何在链表中添加新的元素
1.把要添加元素的结点的下一个结点的地址值修改为新添加元素的结点的地址值
2.把新元素的下一个结点的地址值修改为原元素所在结点的下一个地址值
查询慢,增删块
栈:
栈的特点:
先进后出,可以理解为死胡同
队列:
先进先出
List接口: Set:
有序的(存储和读取的顺序是一致的) 无序
有整数索引 无索引
允许重复的 不允许重复
list的特有功能
void add();在指定索引位置增加元素
E get();通过索引获取元素
E remove();删除指定元素
E set();修改指定索引的元素
List的常用子类:
ArrayList:
底层是数组结构:查询块,增删慢
LinkedList:
链接列表的实现,底层结构是链表,查询慢,增删块
如何选定集合?
如果查询多,增删少则使用ArrayList
如果查询少,增删多则使用LinkedList
如果不知道使用哪一个就用ArrayLsit
LinkedList特有的功能:
允许元素为null
void addFirst();在集合索引为0添加元素
void addLast();在集合索引为size()-1添加元素
E getFirst();获取集合索引为0的元素
E getLast();获取集合索引为size()-1的元素
E removeFirst();删除..
E removeLast();删除..
使用ArrayList集合比较相同 要重写equals方法
|
|