集合框架
Java中的集合框架图
Java中的集合,⼤致分为两类。分别是 Collection 集合和 Map 集合。
其中,Collection是单列集合的顶级接⼝,Map接⼝是双列集合的顶级接⼝。




Collection集合
存储特点
Collection接⼝是单列集合的顶级接⼝。 在这种集合中存储的数据, 只占⼀列。 所有的元素, 直接存储于各种数据结构中。
Collection集合中, 没有下标的概念。
Collection API
接⼝⽅法
由于这个接⼝是单列集合的顶级接⼝, 在这⾥定义的所有的⽅法, 在所有的实现类中都是可以使⽤的

Collection集合遍历
迭代器(Iterator)
⼯作原理

使⽤集合的 iterator() ⽅法,获取到⼀个迭代器对象。
原因:迭代器在对集合进⾏遍历时,要与对应的集合产⽣关系,通过集合的⼀个⽅法获取迭代器对象,可以在⽅法内部创建迭代器对象,同时⾃动与当前集合产⽣关系.对于使⽤者来说简化了代码
这个迭代器对象, 内部维护了⼀个引⽤, 指向集合中的某⼀个元素。 默认指向-1位。
使⽤next()⽅法, 向后移动⼀位元素指向, 并返回新的指向的元素。
如果使⽤next()⽅法, 向后移动指向的时候, 已经超出了集合的范围, 指向了⼀个不存在的元素, 会抛出异常NoSuchElenmentException。
⼀般情况下, 配合 hasNext() ⽅法⼀起使⽤的。
// 1. 获取到⼀个迭代器对象
Iterator<String> iterator = collection.iterator();
// 2. 通过hasNext判断是否还有下⼀个元素
while (iterator.hasNext()) {
// 3. 向后指向,并返回这个新的指向的元素
String ele = iterator.next();
System.out.println(ele);
}
注意事项
在使⽤迭代器进⾏元素的遍历过程中,不要使⽤集合的⽅法修改集合中的内容 !!! 否则,会出现ConcurrentModificationException 。可以使⽤迭代器⾃带的remove()⽅法操作.
使用iterator只能删除。
扩充:
这时如果想在继续对集合进行遍历使用
第一:重写获取一个域当前集合关联的迭代器对象
第二:使用当前迭代器对象的子类,实现从左到右的同时在从右到左。
llistit = ist.listIterator();
list.hashNextPrievious()
lsit.previous();
可以进行更新。
增强for循环
// 遍历参数集合中的元素
public static void enumuration(Collection<String> collection) {
// 增强for循环
for (String element : collection) {
System.out.println(element);
}
}
注意事项
在使⽤增强for循环进⾏元素的遍历过程中,不要修改集合中的内容 !!! 否则, 会出现
ConcurrentModificationException 。
原因:增强for循环内部实际调⽤的是⼀个迭代器
forEach
Java8之后,在Collection集合中添加了⼀个新的⽅法 forEach。
⽅法原型:
default void forEach(Consumer<? super T> action)
⽅法逻辑:
将集合中的每⼀个元素,带⼊到参数Consumer函数式接⼝的⽅法中,作为参数。在调⽤这个⽅法的时候,可以⾃定义实现的式。
示例代码:
private static void enumunation3(Collection<String> collection) {
collection.forEach(System.out::println);
}
List集合
存储特点
List集合是单列集合,是Collection接⼝的⼦接⼝。Collection接⼝中所有的⽅法,这⾥都有。同时,这个集合⽐Collection集合,多个若⼲⽅法。
在List接⼝中,是有下标的概念的。多出来的这些⽅法,基本也都是围绕着下标操作的。
List与Set对⽐
List:存储的数据是有序的(元素的存储顺序与添加元素的顺序⼀致),可以重复的.
Set:存储的数据是⽆序的,不可以重复
List API

List集合排序
在List接⼝中,提供了⼀个排序的⽅法 sort
⽅法原型
default void sort(Comparator<? super E> c)
⽅法逻辑
这是⼀个系统封装好的⼀个⽤来做排序的⽅法,由于集合中只能存储引⽤数据类型的数据,因此,需要明确两个元素的⼤⼩关系。参数Comparator是⼀个对象⼤⼩⽐较的接⼝。在这个接⼝的⽅法中,有两个参数,分别表示参与⽐较的两个对象。返回值是int类型,不看具体的值,只看正负。
/**
* 两个对象的⼤⼩⽐较⽅法
* @param o1 参与⽐较的⼀个对象
* @param o2 参与⽐较的另⼀个对象
* @return ⽐较的结果
* > 0 : o1 > o2
* == 0 : o1 == o2
* < 0 : o1 < o2
*/
int compare(T o1, T o2)
List集合遍历
由于List接⼝是继承⾃Collection接⼝的,因此在Collection部分的三种遍历⽅式,都可以⽤来遍历List集合。同时,在List集合中,还添加了两种⽤来遍历集合的其他⽅式。
下标遍历
顾名思义, 类似于数组的下标遍历。 遍历集合中的所有的下标, 依次获取指定下标位的元素。
列表迭代器
这种⽅式, 类似于迭代器。 在List集合中, 有⼀个⽅法 listIterator() , 可以获取到⼀个 ListIterator 接⼝的引⽤。 ⽽ ListIterator 是 Iterator 的⼦接⼝。 因此在保留了传统的迭代器的迭代⽅法的基础上, 还添加了若⼲个其他的⽅法。
ListIterator 中新增了hasPrevious()和previous()⽅法
当我们使⽤hasnext()和next()⽅法实现从左到右遍历后,可以继续使⽤使⽤hasPrevious()和previous()⽅法从右到左遍历.
使⽤ListIterator, 在遍历集合中的元素的同时, 可以向集合中添加元素、删除元素、修改元素。但是, 这⾥对集合中的元素操作, 并不是使⽤ List 接⼝中的⽅法, ⽽是⽤ListIterator 接⼝中的⽅法完成。
()⽅法实现从左到右遍历后,可以继续使⽤使⽤hasPrevious()和previous()⽅法从右到左遍历.
使⽤ListIterator, 在遍历集合中的元素的同时, 可以向集合中添加元素、删除元素、修改元素。但是, 这⾥对集合中的元素操作, 并不是使⽤ List 接⼝中的⽅法, ⽽是⽤ListIterator 接⼝中的⽅法完成。
200

被折叠的 条评论
为什么被折叠?



