1 集合
- 概述:用来存储多个数据的容器。
- 集合和数组的区别:
共同点:
都是用来存储数据的容器,都可以存储多个数据
不同点:
(1)数组的大小是固定的,不能新增也不能减少元素;集合的大小是可以进行改变的,可以往集合中新增元素或者删除元素。
(2)数组既可以存储基本数据类型的数据,也可以存储引用数据类型的数据;集合只能存储引用数据类型数据。
(3)数组中本身操作元素的功能比较少,就只有一个length属性;集合的功能比较多,有很多以操作元素的方法。 - 为什么使用集合?
(1)数组大小固定,如果想新增或者删除元素,操作起来比较麻烦。
使用集合,大小是不固定的,可以不断新增也可以减少。
(2)数组中操作元素的功能较少,如果后续想要操作数组中的元素,需要自己定义各种方法,比较麻烦。集合中提供了很多操作元素的方法,直接使用即可,比较方便。
1.1 集合的体系
集合体系结构图:
2 单列集合体系的详细讲解
2.1 Collection 集合
- 单词:收集,集合
- 概述:此类是单列集合的顶层接口,任何单列集合都属于该接口的子接口或者实现类。
- 特点:
(1)是一个接口不能去创建对象。只能通过实现类创建对象访问其中的方法。
(2)在java.util包,需要导包使用
(3)Collection中定义的方法,子接口和实现类都可以去使用。
2.2 Collection集合的常用方法
函数名 | 解释 |
---|---|
add(E e) | 往集合中添加元素 |
addAll(Collection<? extends E> c) | 将集合c中的内容全添加到调用者集合中 |
remove(Object o) | 删除集合中的o元素 |
removeAll(Collection<?> c) | 删除调用者集合中和c集合中相同的元素 |
clear() | 清空集合 |
contains(Object o) | 判断集合中是否包含元素o |
containsAll(Collection<?> c) | 判断调用者集合中是否全部包含集合c的所有元素 |
isEmpty() | 判断集合是否为空 |
size() | 返回集合中元素的个数 |
代码
package demos2_collection;
import java.util.ArrayList;
import java.util.Collection;
public class Demo02 {
public static void main(String[] args) {
//想学习接口的特殊方法,本身不能创建对象
//使用多态来定义
Collection c = new ArrayList();
//往集合中添加一个元素
c.add("xyz");
c.add("123");
c.add("abc");
System.out.println(c);
Collection c2 = new ArrayList();
c2.add("aaa");
c2.add("bbb");
//将集合c2的元素全部添加到集合c中
c.addAll(c2);
System.out.println(c);
System.out.println(c2);
//删除集合c中的元素“abc”
c.remove("abc");
System.out.println(c);
//将c中 和c2集合相同的元素全部删掉
c.removeAll(c2);
System.out.println(c);
//将集合中的元素全部清空
c.clear();
//判断集合c中是否包含元素“123”
System.out.println(c.contains("123"));
//判断集合c中是否全部包含集合c2的元素
System.out.println(c.containsAll(c2));
//判断集合c是否是空的集合
System.out.println(c.isEmpty());
//返回集合c中元素的个数
System.out.println(c.size());
}
}
3 Collection集合的遍历方式
3.1 Collection集合的第一种遍历方式
- 方式:转数组遍历:将集合中的数据转到一个数组中,再遍历数组,等于是间接的遍历 集合。
- 集合转为数组的方法:toArray()
代码
package demos2_collection;
import java.util.ArrayList;
import java.util.Collection;
public class Demo03 {
public static void main(String[] args) {
Collection c = new ArrayList();
//在往集合中添加元素时,都默认向上转型
//所以集合中的元素都是Object
c.add("xyz");
c.add("abc");
c.add("123");
c.add("qqq");
//集合c中的元素,不能直接获取
// 1、先将集合中的元素先转移到数组中
Object[] obs = c.toArray();
// 2、再去遍历数组,等于间接遍历集合
for (int i = 0; i < obs.length; i++) {
Object o = obs[i];//Object o = new String("xyz");
System.out.println(o.toString());
}
}
}
3.2 Collection集合的第二种遍历方式
- 方式:使用迭代器遍历集合
迭代:更新换代
迭代器:用来遍历集合元素的对象 - 获取迭代器的方式:通过集合定义的方法来获取:iterator()
- 迭代器对象可以使用的方法:
next();
hasNext();
3.2.1 注意事项:
- 使用next方法可以获取集合中的所有元素,虽然反复使用的方法是一样的,但是返回的数据不同。
- next方法不仅可以获取元素,还可以移动指针,获取一次之后,指针指向下一个元素。
- 如果没有下一个元素,仍然获取出现java.util.NoSuchElementException(没有当前元素异常)。
- 可以使用hasnext方法来判断集合中指针指向的当前元素是否存在
- 反复使用next和hasnext方法比较麻烦,所以使用while循环来简化操作。
代码
package demos2_collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo05 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(new Person("张三",23));
c.add(new Person("李四",24));
c.add(new Person("王五",25));
c.add(new Person("赵六",26));
//获取迭代器对象
Iterator it = c.iterator();
//判断是否有下一个元素
while(it.hasNext()){
//获取下一个元素
Person p = (Person)it.next();
//打印元素的属性值
System.out.println(p.getName() +"..." +p.getAge());
}
}
private static void test01() {
Collection c = new ArrayList();
c.add("abc");
c.add("aaa");
c.add("123");
c.add("xyz");
c.add("xyz");
//先获取集合的迭代器对象
Iterator it = c.iterator();
//判断集合中是否有下一个元素
//如果有,就返回true,如果没有就返回false
while(it.hasNext()){
//如果上述表达式为真,表示有元素
//使用next获取下一个元素
Object o = it.next();
System.out.println(o);
}
}
}
3.3 Collection集合的第三种遍历方式
- 方式:使用增强for循环遍历
- 增强for循环:
它是JDK5之后出现的,其内部原理Iterator迭代器相同 - 格式:
for(元素的数据类型 元素名称:集合或者数组名称){
元素名称的使用
}
代码
package demos2_collection;
import java.util.ArrayList;
import java.util.Collection;
public class Demo06 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("abc");
c.add("aaa");
c.add("123");
c.add("xyz");
c.add("xyz");
//使用增强for循环遍历
//底层使用迭代器实现的
for(Object o:c){
System.out.println(o);
}
//使用增强for循环遍历数组
int[] arr = {10,20,30,40};
for(int i:arr){
System.out.println(i);
}
}
}