集合概述
集合就是一种能够存储多个数据的容器。常见的容器有集合和数组。
集合有两大类:Collection(单列集合)、Map(双列集合)。
二者都是接口(也就是说无法实例化),集合类都是实现的这两个接口。在实际编程中经常使用的有 List、Set、Queue(这些是实现的 Collection 接口)HashMap、TreeMap、HashTable(这些实现的 Map 接口)
集合的体系(记忆)
1.单列集合 : Collection接口
List接口 : 1 有序 2 有索引 3 元素可以重复
ArrayList类 : 数组结构(查询快 , 增删慢)
LinkedList类 : 链表结构(查询慢 , 增删快)
Set接口 : 1 无序 2 无索引 3 元素唯一
HashSet类 : 哈希表结构(保证数据唯一 , 查询速度快)
TreeSet类 : 红黑树结构(可以对元素进行排序)
2.双列集合 : Map接口
HashMap类 : 哈希表结构(保证键唯一 , 查询速度快)
TreeMap类 : 红黑树结构(可以对键进行排序)
集合和数组的区别
- 集合长度可变,数组长度固定,不能动态增大容量。
- 集合只能存储引用数据类型(如果需要存储基本数据类型需要进行装箱),数组可以存储基本数据类型也可以存储引用数据类型。
迭代器
概述
迭代器是专门用来对Colection集合(单列集合)进行遍历使用的。学习迭代器的目的就是为了遍历集合。
迭代器和collection的关系
案例代码
package com.itheima.collection_demo.iterator_demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
如果获取一个Iterator对象
Iterator it = 单列集合对象.iterator()
Iterator : 接口 , 迭代器 , 用来遍历单列(Collection)集合
boolean hasNext() : 判断是否存在下一个元素 , 如果存在返回true
E next() : 拿到迭代的下一个元素 , 并把指针往后移动一位
remove() :
*/
public class Demo {
public static void main(String[] args) {
// 泛型为String的集合对象
Collection<String> c = new ArrayList<>();
// 添加元素
c.add("貂蝉");
c.add("小乔");
c.add("大乔");
c.add("尚香");
c.add("甄宓");
// 遍历集合
// 获取迭代器对象,迭代器也有泛型,跟集合对象保持一致即可
Iterator<String> it = c.iterator();
// next方法一次只能拿一个,因此需要循环
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
迭代器使用的注意事项
当使用迭代器遍历集合, 采用集合对象修改了集合的长度(添加 , 删除) , 就会发生ConcurrentModificationException(并发修改异常)。
解决方案:
- 迭代器遍历集合 , 迭代器修改集合的长度 , 建议使用!
- 不用迭代器遍历 , 可以采用普通for循环。
但是第二种方案无法对Collection接口定义的集合生效,因为for循环是根据索引进行遍历的,而Collection集合没有索引。List接口才可以实现,但是尽管如此,iterator是没有添加功能的,因此当你想执行添加数据操作时,什么接口都不好使,这个时候就需要拓展一下,要用到列表迭代器——public interface ListIterator extends Iterator,它有add方法,不过列表迭代器只能遍历List集合,仍然存在一定的局限性。
package com.itheima.collection_demo.iterator_demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo2 {
public static void main(String[] args) {
// 集合对象
Collection<String> c = new ArrayList<>();
// 添加元素
c.add("貂蝉");
c.add("小乔");
c.add("大乔");
c.add("尚香");
c.add("甄宓");
// 判断是否存在小乔 , 如果存在删除小乔
Iterator<String> it = c.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.equals("小乔")) {
// c.remove(); 会报错
it.remove();
}
}
System.out.println(c);
}
}