集合体系结构
1.集合主要分为单列集合(Collection)和双列集合(Map)。
2.单列集合在添加数据时都是单个添加,而双列集合在添加数据时是成对添加。
单列集合:Collection
1.Collection集合下又包括了List集合和Set集合,List集合下又包括了ArrayList集合,LinkedList集合以及被淘汰了的Vector集合;Set集合下又包括了HashSet集合和TreeSet集合,其中HashSet集合下面又有LinkedHashSet集合。(红色标记为接口,蓝色标记为实现类)
2.List系列集合特点:添加的元素是有序、可重复、有索引的。
- 有序:存和取的顺序是一样的
- 可重复:集合中存储的元素是可以重复的
- 有索引:可以通过索引去取集合中的元素
3.Set系列集合特点:添加的元素是无序、不重复、无索引的。
- 无序:存和取的顺序有可能是不一样的
- 不重复:集合中不能存储重复的元素
- 无索引:不能通过索引去获得集合中的元素
4.Collection是单列集合的祖宗接口,他的功能是全部单列集合都可以继承使用的。
5.Collection中的方法:
方法名 | 说明 |
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数/集合的长度 |
6.add方法返回值是boolean,当往List系列 集合中添加数据,返回值永远为true,当往Set系列集合添加数据,就会判断当前元素是否存在,如果存在返回false,不存在就添加进集合,返回true。
7.contains方法细节:contains方法底层是使用javabean类中的equals方法进行判断是否存在的,所以 ,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么在javabean类中,一定要重写equals方法。
Collection的遍历方式
1.迭代器遍历:
- 迭代器不依赖索引
- 迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式
- Collection集合获取迭代器: Iterator<E> iterator() ,返回迭代器对象,默认指向当前集合的0索引
- Iterator常用方法
方法名 | 说明 |
boolean hasNext() | 判断当前位置是否有元素,有元素返回true,没有元素返回false |
E next() | 获取当前位置的元素,并将迭代器对象移向下一个位置 |
void remove() | 从迭代器指向的collection中一处迭代器返回的最后一个元素(也就是最近使用next方法访问的元素) |
2.迭代器注意点:
- 如果当前的hasNext方法返回的已经是false,仍然使用next方法获取元素就会报错NoSuchElementException
- 当迭代器遍历完毕,指针不会复位,因此如果还想要从头遍历,那就要获取一个新的迭代器
- 循环中最好只使用一次next方法,否则容易出现越位,找不到元素报错
- 迭代器遍历时,不能用集合的方法进行增加或者删除,否则会出现并发错误(暂时不了解),如果实在要删除,可以使用迭代器的remove方法,而添加暂时没有办法
3.增强for遍历:
- 增强for的底层就是迭代器,为了简化迭代器的代码书写的
- 它是JDK5之后出现的,其内部原理就是一个Iterator迭代器
- 只有单列集合和数组才能用增强for进行遍历
//格式:
for(元素的数据类型 变量名:数组或者集合){
}
//此处的变量名就是一个第三方变量,去接收每一次next方法的结果然后去使用
//可以直接使用list.for快捷生成加强for遍历
for(String s : list){
sout(s);
}
4.Lambda表达式遍历:
- 得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式
- Lambda表达式实际是使用Collection的foreach方法