一、Collection介绍
提到集合就不得不提一下数组,好多集合底层都是依赖于数组的实现。数组一旦初始化后,长度就确定了,存储数据对象不能达到动态扩展,其次数组存储元素不便于对数组进行添加、修改、删除操作,而且数组可以存储重复元素。这个时候集合对作用显现出来了。集合分为Collection和Map两种体系。下面先介绍Collection的集合类的继承树如下图所示:
单列集合只能一次添加一个数据
双列集合可以一次添加2个数据
Java集合体系架构分为Collection和Map两大集合框架,其中Collection是单列集合的顶级接口,它具有单列存储的特点,即一次只能添加一个元素;而Map则是双列集合的接口。Collection作为顶级接口,它最主要的三个子接口分别是List,Set和Queue。同时,作为顶级接口它抽取了所有实现类的共有方法。
二、Collection的常用方法
Collection作为顶级集合接口,它最常见的实现类是ArrayList,LinkedList,HashSet和TreeSet,作为顶级接口它抽取了所有实现类的共有方法,所有实现Collection接口的实现类均可使用这些方法。例如ArrayList,LinkedList,HashSet和TreeSet均可使用如下共有方法。
下面分别使用Collection
集合接口的方法说明
Collection集合常用方法
接下来我们将结合代码来具体学习Collection相关知识。
方法名 说明 boolean add(E e) 添加元素 boolean remove(Object o) 从集合中移除指定的元素 boolean removeIf(Object o) 根据条件进行移除 void clear() 清空集合中的元素 boolean contains(Object o) 判断集合中是否存在指定的元素 boolean isEmpty() 判断集合是否为空 int size() 集合的长度,也就是集合中元素的个数
2.1 调用add()方法增添数据
具体实现类为ArrayList的Collection
Collection是一个接口,我们不能直接创建他的对象。
所以,现在我们学习他的方法时,只能创建他实现类的对象。
实现类:ArrayList
细节1:如果我们要往list系列集合中添加数据,那么方法永远返回true,因为list集合支持重复元素的添加
细节2:如果我们要往Set系列集合添加数据,如果当前要添加的元素不存在,方法返回true
如果当前要添加的元素存在,则方法返回false,因为Set系列集合不允许重复
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为ArrayListCollection<String> collection=new ArrayList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//普通输出System.out.println(collection);}
具体实现类为LinkedList的Collection
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为LinkedListCollection<String> collection=new LinkedList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//普通输出System.out.println(collection);}
具体实现类为HashSet的Collection
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为HashSetCollection<String> collection=new HashSet<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//普通输出System.out.println(collection);}
具体实现类为TreeSet的Collection
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为TreeSetCollection<String> collection=new TreeSet<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//普通输出System.out.println(collection);}
2.2 调用remove()方法删除指定数据
接下来我们以具体实现类为ArrayList的Collection来举例
Collection是一个接口,我们不能直接创建他的对象。
所以,现在我们学习他的方法时,只能创建他实现类的对象。
实现类:ArrayList细节1:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除。
细节2:方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false
如果要删除的元素不存在,就会删除失败。
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为ArrayListCollection<String> collection=new ArrayList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//调用remove()方法删除指定数据collection.remove("lisi");//普通输出System.out.println(collection);}
2.3 调用clear()方法清空数据
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为ArrayListCollection<String> collection=new ArrayList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//调用clear()方法清空数据collection.clear();//普通输出System.out.println(collection);}
2.4 调用contains()方法判断集合中是否存在指定的元素
4.判断元素是否包含
细节:底层是依赖equals方法进行判断是否存在的。
所以,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,
那么在javabean类中,一定要重写equals方法,因为object类的equals比的是地址值
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为ArrayListCollection<String> collection=new ArrayList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//调用contains()方法判断集合中是否存在指定的元素boolean zhangsan = collection.contains("zhangsan");System.out.println("集合中存在zhangsan此元素吗?"+zhangsan);boolean aoao = collection.contains("aoao");System.out.println("集合中存在aoao此元素吗?"+aoao);}
2.5 调用isEmpty()方法判断集合是否为空
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为ArrayListCollection<String> collection=new ArrayList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//调用isEmpty()方法判断集合是否为空boolean empty = collection.isEmpty();System.out.println("此集合为空吗?"+empty);//调用clear()方法清空集合元素collection.clear();//调用isEmpty()方法判断集合是否为空boolean empty1 = collection.isEmpty();System.out.println("此集合为空吗?"+empty1);}
2.6 调用size()方法获取集合的长度
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为ArrayListCollection<String> collection=new ArrayList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//调用size()方法获取集合的长度int size = collection.size();System.out.println("集合的长度为:"+size);//调用clear()方法清空集合元素collection.clear();//调用size()方法获取集合的长度int size1 = collection.size();System.out.println("集合的长度为:"+size1);}
综合
package collection;import java.util.ArrayList;
import java.util.Collection;/*public boolean add(E e) 添加public void clear() 清空public boolean remove(E e) 删除public boolean contains(Object obj) 判断是否包含public boolean isEmpty() 判断是否为空public int size() 集合长度注意点:Collection是一个接口,我们不能直接创建他的对象。所以,现在我们学习他的方法时,只能创建他实现类的对象。实现类:ArrayList
*/
public class demo1 {public static void main(String[] args) {//目的:为了学习Collection接口里面的方法//自己在做一些练习的时候,还是按照之前的方式去创建对象。Collection<String> coll = new ArrayList<>();//1.添加元素//细节1:如果我们要往list系列集合中添加数据,那么方法永远返回true,因为list集合支持重复元素的添加//细节2:如果我们要往Set系列集合添加数据,如果当前要添加的元素不存在,方法返回true//如果当前要添加的元素存在,则方法返回false,因为Set系列集合不允许重复coll.add("aaa");coll.add("bbb");coll.add("ccc");System.out.println(coll);//[aaa, bbb, ccc]//2.清空//coll.clear();//3.删除//细节1:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除。//细节2:方法会有一个布尔类型的返回值,删除成功返回true,删除失败返回false//如果要删除的元素不存在,就会删除失败。System.out.println(coll.remove("aaa"));System.out.println(coll);//[bbb, ccc]//4.判断元素是否包含//细节:底层是依赖equals方法进行判断是否存在的。//所以,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,// 那么在javabean类中,一定要重写equals方法,因为object类的equals比的是地址值boolean result = coll.contains("bbb");System.out.println(result);//true//5.判断集合是否为空boolean result2= coll.isEmpty();System.out.println(result2);//false//6.获取集合的长度int size= coll.size();//2System.out.println(size);}
}
三、Collection的遍历
由于共有方法中并没有带索引的方法,因此Collection无法使用普通for循环来遍历集合,只能使用普通输出方法,Iterator迭代器遍历和forEach语句遍历集合数据。
3.1 普通输出方法输出Collection集合
public static void main(String[] args) {//创建一个Collection对象,并规定其数据类型为String,指明其实现类为ArrayListCollection<String> collection=new ArrayList<>();//调用add()方法增添数据collection.add("zhangsan");collection.add("lisi");collection.add("wangwu");collection.add("zhaoliu");//普通输出方法输出Collection集合System.out.println(collection);}
3.2 Iterator迭代器输出Collection集合
迭代器介绍
迭代器,集合的专用遍历方式
Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到
Iterator中的常用方法
boolean hasNext(): 判断当前位置是否有元素可以被取出
E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置
Collection集合的遍历
package collection;/*Collection系列集合三种通用的遍历方式:1.迭代器遍历2.增强for遍历3.lambda表达式遍历迭代器遍历相关的三个方法:Iterator<E> iterator() :获取一个迭代器对象boolean hasNext() :判断当前指向的位置是否有元素E next() :获取当前指向的元素并移动指针*/import java.util.ArrayList;
import java.util.Collection;
import java.util.Collection;
import java.util.Iterator;public class demo2 {public static void main(String[] args) {//1.创建集合并添加元素Collection<String> coll= new ArrayList<>();coll.add("a");coll.add("b");coll.add("c");//2.获取迭代器对象//迭代器对象好比是一个指针,默认指向集合的0索引处Iterator<String> it = coll.iterator();//3.利用循环不断的去获取集合中的每一个元素while(it.hasNext()){//4.next方法的二件事情:获取指针指向的元素并且移动指针String str = it.next();System.out.print(str);}}
}
迭代器中删除的方法
void remove(): 删除迭代器对象当前指向的元素
迭代器的细节注意点:
1.报错NoSuchElementException
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法
4.迭代器遍历时,不能用集合的方法进行增加或者删除
如果我实在要删除:那么可以用迭代器提供的remove方法进行删除。
如果我要添加,暂时没有办法。
package collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/*迭代器的细节注意点:1.报错NoSuchElementException2.迭代器遍历完毕,指针不会复位3.循环中只能用一次next方法4.迭代器遍历时,不能用集合的方法进行增加或者删除暂时当做一个结论先行记忆,在今天我们会讲解源码详细的再来分析。如果我实在要删除:那么可以用迭代器提供的remove方法进行删除。如果我要添加,暂时没有办法。*/
public class demo3 {public static void main(String[] args) {//1.创建集合并且添加元素Collection<String> coll = new ArrayList<>();coll.add("aaa");coll.add("bbb");coll.add("ccc");//2.获取迭代器对象//迭代器对象好比是一个指针,默认指向集合的0索引处Iterator<String> it = coll.iterator();//3.利用循环不断的去获取集合中的每一个元素while (it.hasNext()) {//4.next方法的二件事情:获取指针指向的元素并且移动指针String str = it.next();System.out.print(str);}System.out.println();//当上面循环结束之后,//迭代器的指针已经指向了最后没有元素的位置// System.out.println(it.next());//报错NoSuchElementException//迭代器遍历完毕,指针不会复位System.out.println(it.hasNext());//false//如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象Iterator<String> it2 = coll.iterator();while (it2.hasNext()) {String str = it2.next();System.out.print(str);//4.迭代器遍历时,不能用集合的方法进行增加或者删除if ("aaa".equals(str)) {//指向谁,那么此时就删除谁.// coll.remove("aaa");//报错it2.remove();}}System.out.println();System.out.println(coll);//[bbb, ccc]}
}
3.3增强for
package collection;import java.util.ArrayList;
import java.util.Collection;/* Collection系列集合三种通用的遍历方式:1.迭代器遍历2.增强for遍历3.lambda表达式遍历增强for格式:for(数据类型 变量名: 集合/数组){}快速生成方式:集合的名字 + for 回车*/
public class demo4 {public static void main(String[] args) {//1.创建集合并添加元素Collection<String>coll=new ArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");//2.利用增强for进行遍历//注意点://s其实就是一个第三方变量,//本质是暂时存储集合里面的内容的第三方变量//在循环的过程中依次表示集合中的每一个数据for (String s : coll) {s="qqq";}System.out.println(coll);//zhangsan lisi wangwu}
}
3.4lambda表达式
利用forEach方法,再结合lambda表达式的方式进行遍历
package collection; /* Collection系列集合三种通用的遍历方式:1.迭代器遍历2.增强for遍历3.lambda表达式遍历lambda表达式遍历:default void forEach(Consumer<? super T> action):*/import java.util.ArrayList; import java.util.Collection; import java.util.function.Consumer;public class demo6 {public static void main(String[] args) {//1.创建集合并添加元素Collection <String> coll=new ArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");//2.利用匿名内部类的形式//底层原理//其实也会有自己遍历集合,依次得到每一个元素//把得到的每一个元素,传递给下面的accept方法//s依次表示集合中的每一个数据/*coll.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);//zhangsan lisi wangwu}});*///lambda表达式coll.forEach((String s) ->System.out.println(s));} }