Collection 集合的体系图

Collection 集合介绍
Collection 是单列集合的祖宗接口,他的功能是全部单列集合都可以继承使用的。
Collection 集合又分为list和set两类
* List系列集合特点:
1.添加的元素有序,可重复,有索引。
2.有序:存和取的顺序是一样的;
3.可重复:集合中存的元素是可以重复的;
4.有索引:可以通过索引获取集合中的元素;
* Set系列集合特点:
1.添加的元素无序,不重复,无索引。
2.无序:存和取的数据有可能不一样;
3.不重复:元素不能重复(利用这个特性可以做数据去重);
4.无索引:不能通过索引获取元素;
Collection 类常用方法
public interface Collection<E> extends Iterable<E> {
/**
* 添加元素
* 1.如果往list系列集合中添加数据,add方法永远返回true(list系列集合元素可重复);
* 2.如果往set系列集合中提那家数据,如果要添加的元素存在就返回false,如果要添加的元素不存在就返回true(set系列集合元素不重复);
*/
boolean add(E e);
/**
* 清空所有元素
*/
void clear();
/**
* 移除元素
* 1.因为 Collection 中定义的都是共性方法,所以此时不能用索引删除(set系列集合没有索引),只能通过对象删除;
* 2.如果要删除的元素不存在,返回false,否则返回true;
*/
boolean remove(Object o);
/**
* 是否包含某个元素
* 1.底层是依赖equals方法进行判断是否存在的。
* 2.如果集合中存的是自定义对象,也行通过contains方法来判断是否包含,需要在javaBean中重写equals方法。
* 3.如果存的自定义对象没有重写equals方法,就会使用父类Object中的equals方法进行判断,Object类的equals方法是根据地址值来判断对象是否相等的;
* 4.需求,自定义对象中,如果需要根据属性值判断是否是同一个元素,该怎么办?重写equals方法,系统会自动生成该方法,通过属性去判断是否是同一个对象;
*/
boolean contains(Object o);
/**
* 集合是否为空
* 1.底层直接判断size==0,然后返回结果
*/
boolean isEmpty();
/**
* 集合的长度、元素的个数
*/
int size();
}
Collection 的遍历方式
Collection 的遍历方式
1.迭代器
2.增强for循环
3.Lambda表达式遍历
注意:
1.Collection 的子类有list和set两种,set集合没有索引,是不能使用普通for循环的。
Collection 类常用方法1:迭代器
迭代器:
* 特点:不依赖索引;
* 类:迭代器在java中的类是Iterator,迭代器是集合转用的遍历方式;
* 使用:
Collection集合获取迭代器的方法:
* Iterator<E> iterator();
Iterator的常用方法:
* boolean hasNext();
* E next();
* 代码示例:
Collection<String> list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
System.out.println("------>> " + str);
}
* 使用迭代器需要注意的细节
1.如果迭代器指向的位置没有对象,强行调用next方法会报NoSuchElementException(没有这个元素异常);
2.迭代器遍历结束后,指针是不会复位的,如果需要再次遍历,只能再次获取一个新的迭代器对象;
3.循环中只能用一次next方法;
4.迭代器遍历时,不能用集合的方法进行增加或者删除;
* 总结:
1.迭代器在遍历集合的时候是不依赖索引的(是通过创建指针,并且移动指针的方式获取集合中的每一个元素);
2. 迭代器中需要掌握的三个方法
* Iterator<E> iterator = 集合对象.iterator();
* boolean b = iterator.hasNext();
* E e = iterator.next();
3.迭代器的4个小细节:
1.如果当前位置没有元素,还要强行获取,会报NoSuchElementException(没有这个元素异常);
2.迭代器遍历完毕,指针是不会复位的;
3.迭代器遍历中,只能调用一次next方法;
4.迭代器遍历时,不能使用集合的方法进行增加或者删除;
MST - 迭代器
Q1:Collection 集合有那些遍历方法?
A:遍历方法有
* 迭代器
* 增强for循环
* Lambda表达式遍历
Q2:Collection 集合用迭代器遍历的时候,next方法能调用多次吗?为什么?
A:迭代器在遍历的时候,获取每个元素的时候只能调用一次next方法。
因为调用一次next方法,做了两件事,"获取当前位置的元素,并将指针移到下一个位置",如果调用多次,当遍历到最后一个位置的时候,hasNext方法返回true,此时会调用多次next方法,导致指针移动了多次,并且获取元素的时候已经没有了,会报NoSuchElementException(没有这个元素异常)。
迭代器遍历的时候要保证移动一次调用次;
Q3:迭代器遍历的时候,如果强行使用next方法获取没有元素的位置,会发生什么?
A:会报NoSuchElementException(没有这个元素异常)。
Q4:为什么报的是"没有这个元素"异常,而不是"下标越界"异常?
A:因为这个集合没有索引。
Q5:用迭代器遍历集合的时候能不能调用集合的添加和移除方法?
A:不能。
* 迭代器遍历的时候调用集合的添加和删除方法会报ConcurrentModificationException(并发修改异常)。
* 如果要添加,暂时没有方法。
* 如果要在迭代器遍历的时候删除元素,可以调用迭代器自带的remove方法进行删除元素)(iterator.remove())。
Collection 类常用方法2:增强for
1.什么是增强for遍历?
* 增强for的底层就是迭代器,为了简化迭代器的代码书写而来的。
* JDK5之后出现的,其内部原理就是一个Iterator迭代器。
* 所有的单列集合和数组才能用增强for进行遍历。
2.增强for的代码格式
for(元素的数据类型 变量名 : 数组或者集合){
}
例如:
for (String s : list) {
System.out.println(s);
}
3.细节
1.修改增强for中的变量,不会改变集合中本来的数据
Collection<String> list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (String s : list) {
s = "kkk";
}
System.out.println(list);
MST:增强for
Q1:增强for和Iterator有啥区别?
A:
1.代码书写区别:增强for代码书写简单,迭代器相对来说麻烦;
2.增强for循环是流程控制语句,Iterator是遍历对象;
3.增强for不会出现异常,迭代器会报异常;
Collection 类常用方法3:Lambda表达式遍历
JDK8的新技术Lambda表达式,提供了一种更简单,更直接的遍历集合的方式;
方法:
* default void forEach(Consumer<? super T> action)
代码演示:
list.forEach(s -> System.out.println(s));
Collection 总结
1.Collection是单列集合的顶层接口,所有方法被List和Set系列集合共享;
2.常见成员方法
* add
* clear
* remove
* contains
* isEmpty
* size
3.三种通用的遍历方式
* 迭代器:在遍历的过程中要删除元素用迭代器;
* 增强for
* Lambda表达式