今日内容
Collection集合
迭代器
增强for
泛型
斗地主案例
Collection集合
什么是集合
集合就是一个容器,可以存储多个元素
为什么要用集合
之前我们学习过很多的容器,比如变量、数组、StringBuilder,有这么多容器,为什么还要使用集合呢?
因为变量只能存储一个数据,不能存储多个
因为数组有个弊端,一旦初始化长度就固定了
因为StringBuilder虽然可以存储任意的数据,但是存储进去之后都拼接成字符串了,取用不方便
所以咱们出现了一个非常重要而且常用的工具,就是集合
集合的特点:
(1)集合是一个容器,可以存储多个元素
如果没有加泛型,一个集合中可以存储不同类型的数据
如果加了泛型,一个集合只能存储泛型规定那同一类型的数据,推荐加泛型
(2)集合的长度可以改变
(3)集合只能存储引用数据类型的数据,不能存储基本数据类型的数据
由于我们有了自动装箱,其实如果直接存储基本数据类型也是可以的,只不过是先将基本数据类型的数据转为了
引用数据类型的数据,其实最终存储的还只能是引用数据类型的数据
(4)集合有些有索引,有些没有索引
面试题:
数组和集合的区别?
(1)数组长度固定,集合长度可变
(2)数组可以存储任意类型的数据,集合只能存储引用数据类型的数据
集合体系的由来
集合不是一个类,而是一系列的类,集合就和我们现实世界的容器一样,现实世界的容器根据作用、特点、容量等
不同可以分为不同的容器,Java中的集合也是类似的情况,根据集合的特点或者作用不同也分为很多的集合,不同集合
有一些不同的特点,但是还会有很多相同的特点,相同的东西我们就可以不断向上抽取出父类(接口),最终就形参了
集合的继承体系(集合的体系)
集合的体系
Collection(单列集合)
|-List:存取有序(按什么顺序存进去,取出来也是什么顺序),有索引,可以存储重复元素
|-ArrayList
|-Vector
|-LinkedList
|-Set:存取无序,无索引,不能存储重复元素
|-HashSet
|-LinkedHashSet
|-TreeSet
Map(双列集合)
学习的时候从上往下
因为最上面的父类(接口)定义最共性的内容,学习了共性那么下面所有的具体实现类共性操作我们都学会了
学会了共性之后,再去针对某个具体的集合去学习它特性(非共性)的内容,那么所以的集合我们都能轻松搞定
使用的时候从下往上
使用的时候是使用具体的实现类的功能,上面的共性的类(接口)都是抽象的方法
Collection
共性的常用方法
增
boolean add(E e) :添加元素,添加成功返回true,添加失败返回false
删
void clear() :清空集合(删除集合中的所有元素)
boolean remove(Object o) :删除集合中的指定元素
查
int size() :返回集合中的元素的个数
Iterator<E> iterator()
判断方法
boolean contains(Object o) :判断集合中是否包含该元素
boolean isEmpty() :判断集合中是否有元素
增删改查
面试题:
以下方法不属于Collection接口的是(BD)
A.remove(Object o)
B.get(int index)
C.clear()
D.remove(int index)
迭代器
一个取出集合元素(遍历)的工具
Iterator接口
boolean hasNext():判断集合中是否还有下一个元素
E next() :获取集合中下一个元素
void remove() :删除集合中的元素
使用迭代器去获取元素,如果没有元素就会抛出一个异常:NoSuchElementException
步骤:
(1)创建集合
(2)添加元素
(3)迭代器遍历
a.获取到迭代器对象
b.在while循环中判断是否有下一个元素
c.在while循环中获取下一个元素
// (1)创建集合
Collection<String> c = new ArrayList<>();
// (2)添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("php");
// (3)迭代器遍历
// a.获取到迭代器对象
Iterator<String> it = c.iterator();
// b.在while循环中判断是否有下一个元素
while(it.hasNext()){
// c.在while循环中获取下一个元素
String str = it.next();
System.out.println(str);
}
集合的遍历方式
方式一:普通for,结合get(int index)和size()方法 [只适用于List体系的集合]
//创建一个集合对象
ArrayList<String> coll = new ArrayList<>();
//往集合中添加元素
coll.add("姚明");
coll.add("科比");
coll.add("麦迪");
coll.add("詹姆斯");
coll.add("艾弗森");
for (int i = 0; i < coll.size(); i++) {
System.out.println(coll.get(i));
}
方式二:迭代器(Iterator) [适用于所有的Collection集合]
// (1)创建集合
Collection<String> c = new ArrayList<>();
// (2)添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("php");
// (3)迭代器遍历
// a.获取到迭代器对象
Iterator<String> it = c.iterator();
// b.在while循环中判断是否有下一个元素
while(it.hasNext()){
// c.在while循环中获取下一个元素
String str = it.next();
System.out.println(str);
}
方式三:增强for [适用于所有的Collection集合]
// (1)创建集合
Collection<String> c = new ArrayList<>();
// (2)添加元素
c.add("hello");
c.add("world");
c.add("java");
c.add("php");
for(String s:c){
// s就是其中的每一个元素
System.out.println(s);
}
增强for
JDK1.5的新特性,可以遍历数组和Collection集合
格式:
for(元素类型 元素名:数组或者Collection集合){
System.out.println(元素名);
}
增强for的底层,遍历集合使用的是迭代器
JDK1.5的新特性:
自动拆装箱、增强for、泛型
泛型
JDK1.5的新特性
格式:<类型>
泛型中的类型只能是引用数据类型
ArrayList<int> ×
ArrayList<Integer> √
泛型可以理解成一种广泛的类型,不是固定的某种类型,你想让它是什么类型就可以是什么类型
泛型中的类型就规定了集合中存储的元素的类型
泛型使用的注意事项
泛型前后必须一致
ArrayList<Integer> list = new ArrayList<String>(); ×
ArrayList<Integer> list = new ArrayList<Integer>(); √
JDK1.7的新特性:菱形泛型,后面可以不加泛型
ArrayList<Integer> list = new ArrayList<>();
泛型的好处
(1)省去了强转的麻烦,泛型规定了什么类型,取出元素自动就是那个类型
(2)将解决问题的时间提前,将运行时期可能出现的异常,提前到了编译时期解决