一、集合框架概述
1.集合的引入
我们为什么要学习集合框架呢? 我们前面学习了 Java 的基本数据类型,引用类型都是可以用来存储我们的数据的,但是仅仅只能存储单个,我们可以通过数组的形式来存储多个数据,但是数据有个特点是长度是不能改变的,那也就意味着数组在处理需要对数组中的数据做添加和删除操作的时候就会显得非常麻烦。所以 Java 给我们提供了集合类来解决这个问题。
2.集合的概念
JavaAPI 所提供的一系列类的实例,可以用来动态的存放多个对象。 Java 集合框架提供了一套性能优良,使用方便的接口和类,位于java.util 包中。 集合的特点: 长度不固定,只能存储引用类型的对象 。
与Set集合不同,列表通常允许重复的元素
List集合特点
有序、存储和取出的元素顺序一致
可重复:存储的元素可以重复
List继承collection方法
集合和数组的区别
类型 | 说明 |
---|---|
长度 | 数组:长度固定不可变 集合:长度可根据实际需求变动 |
内容 | 数组:存储的是统一类型的数据 集合:可以存储不同类型的数据 |
数据类型 | 数组:可以存储基本数据类型和引用数据类型 集合:只能存储引用数据类型 |
集合框架图
二、 Collection接口
-
集合的设计理念
结合集合的框架结构,我们可以推演下集合的设计,因为集合有多 增删改查 的方法,而且集合是一套框架,既然是框架那么每一种集合在处理 增删改查 的时候的方式会不一样。 Collection 的特点:
-
有序:部分集合实现是有序的,部分集合实现是无序的。这里的有序指的是存储的顺序。
-
可排序:部分集合实现是可排序的,部分集合实现是不可排序的。
-
可重复:部分集合是可重复的,部分集合是不可重复的。
既然每一个集合的特点不一样,那么就取决于所有子类的实现方法不一样,但是我们知道,在集合中所有的集合应该具有集合共有特点:
-
长度可变。
-
能够存储任意的引用类型。
-
具备很多对象的 增删改查 的方法。
-
集合也能够存储基本数据类的包装类。
只是说每一个集合类的实现方式不一样罢了。实现方式其实就取决于底层的数据结构。
2.Collection接口的常用方法
2.1 添加功能
boolean add(E e)
//确保此集合包含指定的元素(可选操作)。
boolean addAll(Collection<? extends E> c)
//将指定集合中的所有元素添加到此集合(可选操作)。
2.2 删除功能
void clear()
// 从此集合中删除所有元素(可选操作)。
boolean remove(Object o)
// 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
boolean removeAll(Collection<?> c)
// 删除指定集合中包含的所有此集合的元素(可选操作)。
2.3 修改功能
修改功能 在 Collection 接口中并没有提供直接修改的方法,如果你要修改那么可以先删除,再添加。
System.out.println(c1);
c1.remove(3);
c1.add(5);
System.out.println(c1);
2.4 遍历功能
Object[] toArray()
// 返回一个包含此集合中所有元素的数组。
Iterator<E> iterator()
// 返回此集合中的元素的迭代器。
2.5 判断功能
boolean isEmpty()
// 如果此集合不包含元素,则返回 true 。
boolean contains(Object o)
// 如果此集合包含指定的元素,则返回 true 。
boolean containsAll(Collection<?> c)
// 如果此集合包含指定 集合中的所有元素,则返回true。
2.6 其他功能
int size()
// 返回此集合中的元素数。
boolean retainAll(Collection<?> c)
// 仅保留此集合中包含在指定集合中的元素(可选操作) 求交集的方法。
// retainAll 求交集 返回的结果是观察原集合是否发生了改变,true改变 false 没有改变
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo1 {
/* Collection接口中的常用方法
* 1. 长度可变
* 2. 能够存储任意的引用类型
* 3. 具备很多对象的`增删改查`的方法
* 4. 集合也能够存储基本数据类的包装类
*/
public static void main(String[] args) {
Collection c1=new ArrayList();
//加
c1.add("小强");
c1.add("小明");
c1.add("小红");
c1.add(true);
c1.add(5);
System.out.println(c1);
Collection c2=new ArrayList();
c2.add("小花");
c2.addAll(c1);
System.out.println(c2);
//减 改
c2.remove(5);
c2.add(6);
System.out.println(c2);
//遍历功能
Object[] objects = c2.toArray();
for (Object o:objects){
System.out.println(o);
}
System.out.println("----------------");
//迭代器
Iterator it = c1.iterator();
while (it.hasNext()){
Object s = it.next();
System.out.println(s);
}
//判断功能
System.out.println(c1.contains("小明"));
System.out.println(c1.containsAll(c2));
System.out.println(c1.isEmpty());
}
}
3.Iterator接口
所有的实现了 Collection 接口的集合类都有一个 iterator() 方法,该方法返回一个 Iterator 接口对象。提供的有集合数据遍历的方式。
boolean hasNext()
//判断是否有下一个元素
//如果迭代具有更多元素,则返回 true 。
E next()
//返回迭代中的下一个元素。
default void remove()
// 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。
3.1 遍历集合元素
我们需要结合 hasNext 方法和 next 方法一块来实现。
代码示例:
package com.bobo.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo04 {
public static void main(String[] args) {
Collection c1 = new ArrayList();
c1.add("张三1");
c1.add("张三2");
c1.add("张三3");
c1.add("张三4");
c1.add("张三5");
System.out.println(c1);
// 通过Iterator迭代遍历集合
Iterator iterator = c1.iterator();
while(iterator.hasNext()){ // 判断是否有下一个元素
// 条件成立 获取下一个元素 并移动游标位置
Object o = iterator.next();
System.out.println(o);
}
}
}
3.2 移除集合元素
通过循环的方式移除所有的元素同样需要结合 hasNext 方法 next 方法以及 remove 方法来实现。
package com.bobo.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo06 {
/**
* Iterator接口
*
* @param args
*/
public static void main(String[] args) {
Collection c1 = new ArrayList();
c1.add("张三1");
c1.add("张三2");
c1.add("张三3");
c1.add("张三4");
c1.add("张三5");
System.out.println(c1);
// 通过Iterator迭代遍历集合
Iterator iterator = c1.iterator();
/*iterator.next(); // 将游标移动到第一个元素的右侧
iterator.remove(); // 移除游标左侧的元素
System.out.println(c1);*/
while(iterator.hasNext()){
iterator.next(); // 将游标移动在元素的右侧
iterator.remove(); // 删除元素
}
System.out.println(c1);
}
}
4.foreach循环
在 Collection 接口中我们是可以通过 foreach 循环来实现遍历集合中的元素的。
代码示例:
import java.util.ArrayList;
import java.util.Collection;
public class Demo2 {
public static void main(String[] args) {
Collection c1=new ArrayList();
c1.add("张三1");
c1.add("张三2");
c1.add("张三3");
c1.add("张三4");
c1.add("张三5");
c1.add("张三6");
System.out.println(c1);
//foreach循环来实现遍历
for (Object o:c1) {
System.out.println(o);
}
}
}