一、为什么使用集合
数组在使用的时候:
1.要定义容器的大小,超了直接报异常
2.数组的操作的方法是很少的,没有封装。
3.数据也是比较单一
期望有一个java的方式,可以把那些数组方法题封装到一起,供程序员使用。
Collection 集合 【接口】
完成了一系列的增删改查的操作
二、集合的架构
Collection<E> java中所有集合的总接口
--List<E> Collection下面的子接口,特征:有序的,可重复的。
----AbstractList是实现了 List 接口的抽象类
--------ArrayList<E>重点 可变长的数组容器, ArrayList是一个类
--------LinkedList<E>链表数组
--------Vector <E>安全版本ArrayList
--Set<E>也是Collection下面的子接口。特征:无序的,不可重复的
----HashSet<E> 底层是一个hash表
----TreeSet<E> 底层是一个树结构
三、collection的常用方法
只要实现了collection接口或实现了collection的子接口,就可以使用collection下面的所有方法
增:
boolean add(E e):添加指定的元素到Collection集合中,尾插法,存在泛型的约束
boolean addAll(Collection <? extends E> c):添加一个集合到另外一个集合中
删:
remove(Object o):删除在集合中指定的元素
removeAll(Collection<?> c):删除两个集合的交集
retainAll(Collection<?> c):保留两个集合的交集
clear():清空集合
查:
int size():获取集合中元素的个数
Object[] toArray():返回整个集合中所有元素的Object类型的数组
boolean contains(Object o):判断指定的元素是否在当前的集合中
boolean containsAll(Collection<?> c):判断指定的集合是否是当前集合的子集
boolean isEmpty():判断当前集合是否为空
示例:
import java.util.ArrayList;
import java.util.Collection;
/**
* @author xue_yun_xiang
* @create 2021-03-15-8:18
*/
public class CollectionTest {
public static void main(String[] args) {
//boolean add(E e)
Collection<String> list = new ArrayList<>();
list.add("王一");
list.add("王二");
list.add("王三");
System.out.println(list);//[王一, 王二, 王三]
//boolean addAll(Collection<? extends E> c)
Collection<String> list1 = new ArrayList<>();
list1.add("李一");
list1.add("李二");
System.out.println(list1);//[李一, 李二]
list.addAll(list1);
System.out.println(list);//[王一, 王二, 王三, 李一, 李二]
//不同类型无法添加的测试
Collection<Integer> list2 = new ArrayList<>();
list2.add(1);
//list.addAll(list2);编译报错
//remove(Object o)
ArrayList<Integer> list3 = new ArrayList<>();
list3.add(1);
list3.add(2);
list3.add(3);
list3.add(4);
list3.add(5);
System.out.println(list3);//[1, 2, 3, 4, 5]
list3.remove(2);
System.out.println(list3);//[1, 2, 4, 5]
ArrayList<Integer> list4 = new ArrayList<>();
list4.add(4);
list4.add(5);
list4.add(6);
list4.add(7);
list4.add(8);
System.out.println(list4);//[4, 5, 6, 7, 8]
//removeAll(Collection<?> c)
//list3.removeAll(list4);
//System.out.println(list3);//[1, 2]
list3.retainAll(list4);
System.out.println(list3);//[4, 5]
ArrayList<String> list5 = new ArrayList<>();
list5.add("张一");
list5.add("张二");
list5.add("张三");
list5.add("张四");
list5.add("张五");
System.out.println(list5);//[张一, 张二, 张三, 张四, 张五]
//int size()
System.out.println(list5.size());//5
//boolean contains(Object o)
System.out.println(list5.contains("张二"));//true
//boolean isEmpty()
System.out.println(list5.isEmpty());//false
ArrayList<String> list6 = new ArrayList<>();
list6.add("张四");
list6.add("张五");
list6.add("张六");
System.out.println(list6);//[张四, 张五,张六]
//boolean containsAll(Collection<?> c):判断指定的集合是否是当前集合的子集合
System.out.println(list5.containsAll(list6));//false
//Object[] toArray()
Object[] objects = list5.toArray();
for (Object o : objects) {
System.out.print(o + " ");//张一 张二 张三 张四 张五
}
}
}
四、迭代器
迭代器提供的另外一种操作集合的方式:
for循环 增强for循环 迭代器
获取迭代器对象:
通过集合对象获取迭代器
Iterator<E> iterator();
常用的方法:
boolean hasNext();判断是否继续遍历。
object next();获取当前迭代器指向的元素,并且指向下一个元素
void remove(); 删除,迭代器循环里不能使用对象移除数据,只能使用迭代器移除!!!!!!
示例:
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author xue_yun_xiang
* @create 2021-03-15-13:28
*/
public class IteratorTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(2);
list.add(3);
list.add(5);
list.add(5);
list.add(6);
list.add(1);
//1、获取迭代器对象 Iterator
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
iterator.remove();//打印一个移除一个,迭代器循环里不能使用对象移除数据,只能使用迭代器移除!!!!!!
}
System.out.println();
System.out.println(list.isEmpty());
}
}
运行结果:
10 2 3 5 5 6 1
true