-
集合类的由来
对象用于封装特有数据,面向对象的语言会产生很多对象,为了方便操作对象,所以
首先对对象进行存储,而集合就是用于存储对象的容器. -
集合的特点:
- 用于存储对象的容器
- 集合的长度是可变的
- 集合中不可以存储基本数据类型值, 集合是用于存储对象的
-
集合框架
集合容器因为内部的数据结构不同,有多种具体容器,不断的向上抽取, 就形成了集合框架.
框架的顶层就是 Collection 接口, 即定义类集合体系中的共性方法 -
集合框架的构成及分类
- Collection 的常见方法
-
添加
-
boolean add(Object obj); // 添加成功, 返回值为真.否则,为假
boolean addAll(Collection coll);
2. 删除,(只有两种表现形式: delete 或者 remove)
```
boolean remove(Object obj); //会改变集合的长度
boolean removeAll(Collection coll); // 将两个集合中的相同元素从调用 removeAll() 的集合中删除
void clear(); //清空, 将集合中的元素都删掉, 集合还存在
3. 判断
```
boolean contains(Object obj);
boolean containsAll(Collection coll);
boolean isEmpty(); // 判断集合是否有元素
4. 获取
```
int size(); // 获取长度的方法,length 或者 size
Iterator iterator(); // 迭代器, 取出集合中元素的方式
5. 其他
```
boolean retainAll(Collection coll); // 取交集, 保留和指定的集合相同的元素, 删除不同的元素
// 和 removeAll 功能相反
Object[] toArray(); // 将集合转成数组
### 迭代器的使用及原理
public static void main(String[] args){
Collection coll = new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
// 使用 Collection 中的 iterator() 方法. 调用集合中的迭代器方法,
// 是为了获取集合中的迭代器对象
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
// for 循环结束后, it 从内存中消失, 节约内存
for(Iterator it = coll.iterator(); it.hasNext(); ){
System.out.println(it.next());
}
}
Iterator 对象必须依赖与具体的容器, 因为每一个容器的数据结构不同, 所以该迭代器对象是在容器中进行
内部实现的.对于使用容器者而言, 具体的实现不重要,只要通过容器获取到该实现迭代器的对象即可, 也就是
iterator() 方法.
Iterator 接口就是对所有的 Collection 容器进行元素取出的公共接口.
![](http://images2017.cnblogs.com/blog/1222878/201709/1222878-20170907100335288-435046699.png)
- Collection 接口的子接口
- List: 有序(存入和取出的顺序一致), 元素有索引(角标), 元素可以重复
- Set: 元素不能重复, 无序.
- List 接口
1. 常见方法
```
// 1. 添加
void add(index, element);
void add(index, collection);
// 2. 删除
Object remove(index); // 返回被删除对象
// 3. 修改
Object set(index, element); // 使用指定元素替换列表中指定位置的元素, 返回被替换对象
// 4. 获取
Object get(index);
int indexOf(object);
int lastIndexOf(object);
List subList(from, to); // 包含头, 不包含尾
2. List 集合元素取出方式:
public static void main(String[] args){
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
// 通用取出方式
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println("next:" + it.next());
}
// list 特有取出方式
for(int i = 0; i<list.size(); i++){
System.out.println("get:" + list.get(i));
}
}
3. 异常情况
public static void main(String[] args){
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next(); //出现异常, java.util.ConcurrentModificationException
// 在遍历的过程中, 既有迭代器遍历元素, 又有集合添加元素.
// 集合添加的元素, 迭代器并不知道, 因此出现异常
if(obj.equals("abc2"))
list.add("abc9");
else
System.out.println("next:" + obj);
}
}
// 解决方案: 使用 Iterator 接口的子接口 ListIterator 来完成, 在迭代过程中, 对元素进行更多的操作
public static void main(String[] args){
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
ListIterator it = list.listIterator(); // 获取列表迭代器对象
// 它可以实现在迭代过程中对元素的增删改查
// 只有 list 集合具备该迭代功能
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("abc2")){
it.add("abc9");
}
System.out.println("list:" + list);
}
}
_参考资料_ - [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3113337/index_1.html#page=6) - [JDK 1.6 中文文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh)