集合
之前在基础5我们使用过ArrayList,即可变的数组容器,通常用于存储引用类型元素,这就是一种集合。
集合:就是java中提供的可以存储多个数据的容器。
集合与数组的区别:
1)数组的长度固定,集合的长度是可变的;
2)数组中存储的是同一类型的元素,且多是存储基本数据类型值。集合存储的都是对象,且对象类型可以不一致,当对象较多时,常使用集合进行存储。
JAVASE提供了各种集合的API,对于我们来说,要了解其继承与接口的操作,足够熟悉之后,才能知道什么时候采用哪个类,以及类之间如何彼此合作,直到灵活运用。这些集合框架都是很常用的,一定要掌握好。
集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map。
Collection集合
单列集合类的根接口,单列就是像数组那样,一个坑存一个数据值。它有两个重要的子接口,分别是java.util.List和java.util.Set,其中List中元素是有序的/可重复的,Set中元素是无序的/不可重复的。
List接口的主要实现类有java.util.ArrayList和java.util.LinkedList。
Set接口的主要实现类有java.util.HashSet和java.util.TreeSet。
如图所示,最上层是父接口Collection,抽取了单列集合的共性方法,继而分了两个子类接口List和Set,List接口有三个实现类,Set集合也有几个个实现类。然后具体使用的时候,就是用的这些实现类,并不是直接用顶层的接口。
我们从顶层共用的函数开始,这里列举一些常使用的:
-public boolean add(E e):把给定的对象添加到当前集合中。
-public void clear():清空集合中所有的元素。
-public boolean remove(E e):把给定的对象在当前集合中删除。
-public boolean contains(E e):判断当前集合中是否包含给定的对象。
-public boolean isEmpty():判断当前集合是否为空。
-public int size():返回集合中元素的个数。
-public Object[] toArray():把集合中的元素,存储到数组中。
Iterator接口(迭代器)
我们发现,遍历集合中的所有元素,大多是用for循环的方式,还有一种更便捷的方式,就是java.util.Iterator接口,实际上Iterator接口也是集合中的一员,不同的是,这个是用于迭代访问Collection中的元素的。
主要方法:
-public E next():返回迭代的下一个元素。
-public boolean hasNext():如果仍有元素可以迭代,则返回true。
// 添加元素到集合
coll.add(" 串串星人 ");
coll.add(" 吐槽星人 ");
coll.add(" 汪星人 ");
// 遍历
// 使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ // 判断是否有迭代元素
String s = it.next();// 获取迭代出的元素
System.out.println(s);
}
主要过程就是这样,首先获取集合的迭代器对象,然后hasNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明空了,遍历结束。
迭代器遍历的时候,内部采用指针跟踪集合中的元素
图示很简单,刚开始指向集合第一个元素之前,当调用next()方法时,就后移一位,指向对应的元素,每次一定一位。
增强for循环,也就是for each内部也是一个 Iterator 迭代器,所以在遍历的时候,不能对集合中的元素进行增删操作。
for(String s:coll){System.out.println(s);
}
使用起来比Iterator更方便,不过要注意这里牵涉到类型问题,要匹配。
泛型
解释:其实就是一种广泛的类型之意,说白了就是不确定哪种类型,又可以是每个类型,所以就广泛着呗。根据需要,将需要的类型放进去,预先说明是这个类型的,就是这个作用了。这个都是跟着集合使用的,因为集合内的元素是不限制类型的,正好对应着泛型。
--对于类这样用:
修饰符 class 类名 <代表泛型的变量 > { }
--在创建集合对象的时候这样用&#xff1a;
ArrayList list &#61; new ArrayList();
除了关键字以外&#xff0c;也可以自定义一个名字&#xff0c;然后作为泛型参数&#xff0c;只要在使用的时候主要类型一致即可。
--对于接口使用泛型&#xff1a;
修饰符 interface 接口名 <代表泛型的变量 > { }
在使用泛型类或接口时&#xff0c;如果泛型类型不确定&#xff0c;可以先用通配符>表示。
泛型在使用的时候&#xff0c;可以设定上下限&#xff0c;便于更精准的控制类型范围。
-上限&#xff1a;
格式&#xff1a;类型名称 extends 类> 对象名
含义&#xff1a;只能接收该类型及其子类。
-下限&#xff1a;
格式&#xff1a;类型名称 super 类> 对象名
含义&#xff1a;只能接收该类型及其父类。
简单练习
实践需求&#xff1a;斗地主&#xff0c;规则&#xff1a;54张牌打乱顺序&#xff0c;三个玩家交替摸17张牌&#xff0c;留3张底牌。
分析&#xff1a;1.三个玩家集合&#xff0c;一副牌集合&#xff0c;一个底牌集合&#xff1b;2.打乱顺序与交替摸牌&#xff0c;适合带索引的集合&#xff0c;使用ArrayList集合。