集合是用来存储引用类型数据的容器,并且只能存储引用类型数据,不能存储基本类型数据
集合分为两大类:Collection集合与Map集合
Collection集合与Map集合的区别:Collection集合是单个数据的存储,Map集合是按<键,值>对的形式一次存储两个数据,Collection集合又称为单列集合,Map集合又称为双列集合
Collection集合在Java中对应java.util.Collection接口,Collection接口定义一组操作集合的规范:add()添加数据,remove()删除数据等,Collection集合是对Collection接口所有实现类的统称,每个Collection接口的实现类都是Collection集合,实现类才是存储数据的具体容器,这些类相同的操作都抽象到了Collection接口中
Collection集合的基本操作
//创建Collection集合作为容器存储引用数据,Collection是一个接口, 需要赋值实现类对象
Collection collection = new ArrayList(); //实际创建的是ArrayList集合, 通过接口引用collection实际引用了ArrayList实现类对象, 通过collection接口调用抽象方法时, 实际执行的是实现类对象Arraylist对象的方法,这是接口多态.
add()//添加数据,向当前collection添加数据,实际上是把数据添加到ArrayList集合中,可以向集合中添加任意引用类型的数据,//如果添加基本类型数据,系统会先把基本类型数据自动装箱 为包装类对象,再把包装类对象添加到集合中
//打印对象时,会调用对象的toString()方法, 当前collection引用的是ArrayList对象,打印collection实际调用的是ArrayList对象的toString()方法
contains()//判断集合中是否包含某个元素调用
size()//判断集合中元素的数量,
isEmpty()//是否为空集合
foreach//遍历集合中的元素, 输入 iter 生成foreach代码块
remove()//从集合中删除元素调用
clear()//清除集合中所有的数据
//一般情况下,在集合中只存储同一类型的数据,可以在创建集合时,通过泛型指定存储元素的数据类型,在Collection接口后面使用尖括弧指定泛型类型
//如:创建集合存储String字符串
Collection<String> collection = new ArrayList<>();
//从JDK7开始只需要在前面定义集合时指定泛型类型即可,后面创建集合对象时,可以省略泛型类型,系统自动推断; 但是在Jdk6甚至更早的版本中,在后面创建集合对象时也需要指定数据类型
//向集合中添加元素只能添加泛型参数String字符串
//泛型的好处:可以在编译阶段进行数据类型的检查
//Collection集合有iterator()方法返回Iterator迭代器.刚刚调用iterator()方法返回一个新的Iterator迭代器, Iterator迭代器有一个游标指向第一个元素的前面
//迭代器hasNext()方法可以判断游标后面是否还有元素,游标后面有元素返回true,否则返回false
迭代器的next()方法可以返回游标后面的元素, 游标下移 . 当游标已经指向最后一个元素的后面了 ,再调用next()方法会抛出异常 ,即在调用next()方法前需要确定游标后面还有元素,即hasNext()方法返回true之后再调用next()方法
Iterator<String> stringIterator = collection.iterator(); //返回一个迭代器
while ( stringIterator.hasNext() ){
//当hasNext()返回true表示游标后面还有元素时, 调用next()返回游标后面的元素
String next = stringIterator.next();
System.out.println( next );
}
//循环结束后, stringIterator迭代器游标已经指向最后一个元素的后面了, stringIterator迭代器就不能再使用了, 如果还想要迭代重新调用iterator()方法返回一个新的迭代器
//调用remove(o)只能删除第一个与o匹配的元素, 想要删除所有匹配的元素,使用第44行的循环删除, 在该循环中,contains()方法需要遍历一次集合, remove()方法还需要遍历一次集合, 下次循环还需要遍历集合, 需要遍历很多次集合
//在删除集合中所有相同的元素时, 遍历一次集合,如果这个元素与要删除 的元素匹配就删除. foreach循环可以遍历集合中的元素, 但是foreach循环仅用于遍历访问,在foreach循环期间不允许add()添加元素, 也不能remove()删除元素,否则可能会产生异常.. 可以使用迭代器遍历,迭代删除
//在迭代Collection集合时, 输入itco生成迭代代码块, for循环初始化表达式调用iterator()方法返回一个新的迭代器, for循环条件是迭代器hasNext()返回true表示游标后面还有元素, for循环体中调用next()返回下个元素
for (Iterator<String> iterator = collection.iterator(); iterator.hasNext(); ) {
String next = iterator.next();
if ("hehe".equals(next) ){
iterator.remove(); //调用迭代器的remove()方法删除这个元素
// collection.remove("hehe"); //注意在迭代期间 也不能调用集合的add()添加元素或者调用集合的remove()删除元素, 否则可能会产生异常
}
}
//1) 可以在已有的Collection集合的基础上创建一个新 的Collection集合
Collection<String> collection2 = new ArrayList<>(collection);
//2) 调用addAll(Collection)方法把参数Collectoin集合中的元素都添加到当前集合中
//3) 调用removeAll(Collection)遍历当前集合中的元素,如果该元素参数Collection集合中就删除
//4) retainAll(Collection)只保留在参数Collection集合出现的元素,其他元素删除