文章目录
Collection集合
预备知识
什么是集合?
集合和数组类似,都是容器。
集合与数组的区别
集合:
集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。
集合非常适合元素个数不能确定,且需要做元素的增删操作的场景。
同时,集合提供的种类特别的丰富,功能也是非常强大的,开发中集合用的更多。
数组:
数组定义完成并启动后,类型确定、长度固定。
不适合元素的个数和类型不确定的业务场景,更不适合做需要增删数据操作。
数组的功能也比较的单一,处理数据的能力并不是很强大。
数组 | 集合 | |
---|---|---|
元素存储个数 | 类型确定,长度固定 | 类型可以不固定,大小是可变的 |
存储元素的类型 | 可以存储基本类型和引用类型的数据 | 只能存储引用数据类型的数据 |
适合的场景 | 适合做数据个数和类型确定的场景 | 适合做数据个数不确定,且要做增删元素的场景,集合种类更多,功能更强大 |
集合类体系结构:
集合分为Collection(单列)和Map(双列);
Collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。
注意:前期先掌握Collection集合体系的使用。
Collection集合体系:
Collection集合特点:
List系列集合:添加的元素是有序、可重复、有索引。
ArrayList、LinekdList :有序、可重复、有索引。
Set系列集合:添加的元素是无序、不重复、无索引。 l
HashSet: 无序、不重复、无索引;LinkedHashSet: 有序、不重复、无索引。
TreeSet:按照大小默认升序排序、不重复、无索引。
Collection集合对泛型的支持
集合都是泛型的形式,可以在编译阶段约束集合只能操作某种数据类型
正确示例:
Collection<String> lists = new ArrayList<String>();
Collection<String> lists = new ArrayList<>(); // JDK 1.7开始后面的泛型类型申明可以省略不写
注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
所以这种写法是错误的
错误示例:
Collection<int> lists = new ArrayList<>();
如果集合中要存储基本类型的数据怎么办?
我们需要利用包装类,将基本数据类型变成引用数据类型
正确示例:
// 存储基本类型使用包装类
Collection<Integer> lists = new ArrayList<>();
Collection<Double> lists = new ArrayList<>();
Collection集合常用API
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
常用API:
方法名称 | 说明 |
---|---|
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数 |
public Object[] toArray() | 把集合中的元素,存储到数组中 |
示例1:建一个CollectionDemo01类,练习这些API
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo01 {
public static void main(String[] args) {
Collection<String> list1 = new ArrayList<>();
Collection<String> list2 = new ArrayList<>();
list1.add("蔡徐坤");
list1.add("小黑子");
list1.add("真爱粉");
list1.add("荔枝");
list1.add("ikun");
//将对象添加到集合中
System.out.println(list1);
System.out.println(list1.size());
//返回集合中元素的个数
System.out.println( list1.remove("小黑子"));
System.out.println( list1.remove("鸡太美"));
System.out.println(list1);
//把给定的对象在当前集合中删除,如果没有给定的对象,将返回false,表示删除失败;返回true,表示删除成功。
System.out.println(list1.size());
//返回集合中元素的个数
System.out.println(list1.contains("ikun"));
System.out.println(list1.contains("鸡太美"));
//判断当前集合中是否包含给定的对象
System.out.println(list1.isEmpty());
System.out.println(list2.isEmpty());
//判断当前集合是否为空
System.out.println(list1);
System.out.println(list2);
list1.clear();
//清空集合中所有的元素
System.out.println(list1);
System.out.println(list2);
}
}
运行结果:
[蔡徐坤, 小黑子, 真爱粉, 荔枝, ikun]
5
true
false
[蔡徐坤, 真爱粉, 荔枝, ikun]
4
true
false
false
true
[蔡徐坤, 真爱粉, 荔枝, ikun]
[]
[]
[]
补充:方法:public addAll(Collection<? extends E> c)
说明:将一个c集合放入一个集合,c集合本身不变;
示例2:
CollectionDemo02类
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo02 {
public static void main(String[] args) {
Collection<String> c1 = new ArrayList<>();
Collection<String> c2 = new ArrayList<>();
c1.add("java");
c1.add("c");
c2.add("c++");
c2.add("html");
System.out.println(c1);
System.out.println(c2);
c1.addAll(c2);
System.out.println(c1);
System.out.println(c2);
}
}
运行结果:
[java, c]
[c++, html]
[java, c, c++, html]
[c++, html]
Collection集合的遍历方式
方法一:迭代器遍历
迭代器遍历:
遍历就是一个一个的把容器中的元素访问一遍。
迭代器在Java中的代表是Iterator,迭代器是集合的专用的遍历方式。
Collection集合获取迭代器
Iterator中的常用方法
方法名称 | 说明 |
---|---|
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true ,不存在返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。 |
示例3:给一个ArrayList集合,需要遍历。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo03 {
public static void main(String[] args) {
Collection<String> list1 = new ArrayList<>();
list1.add("蔡徐坤");
list1.add("小黑子");
list1.add("真爱粉");
list1.add("荔枝");
list1.add("ikun");
Iterator<String > t = list1.iterator();
while (t.hasNext()){
String s = t.next();
System.out.println(s);
}
}
}
运行结果:
蔡徐坤
小黑子
真爱粉
荔枝
ikun
方法二:foreach/增强for循环
增强for循环的结构:
for(元素数据类型 变量名 : 数组或者Collection集合) {
//在此处使用变量即可,该变量就是元素
}
注意:增强for循环:既可以遍历集合也可以遍历数组。在IDEA中可以用 集合名/数组名+“.”+回车 快速生成。
示例四:CollectionDemo04类
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo04 {
public static void main(String[] args) {
Collection<String> list1 = new ArrayList<>();
Double[] d = {1.0, 3.7, 6.8, 9.0};
list1.add("蔡徐坤");
list1.add("小黑子");
list1.add("真爱粉");
list1.add("荔枝");
list1.add("ikun");
for (String ele : list1) {
System.out.println(ele);
}
for (Double aDouble : d) {
System.out.println(aDouble );
}
}
}
运行结果:
蔡徐坤
小黑子
真爱粉
荔枝
ikun
1.0
3.7
6.8
9.0
方法三:Lambda表达式遍历集合
得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
Collection结合Lambda遍历的API
方法名称 | 说明 |
---|---|
default void forEach(Consumer<? super T> action): | 结合lambda遍历集合 |
示例五:CollectionDemo05类
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo05 {
public static void main(String[] args) {
Collection<String> list1 = new ArrayList<>();
list1.add("蔡徐坤");
list1.add("小黑子");
list1.add("真爱粉");
list1.add("荔枝");
list1.add("ikun");
list1.forEach(s-> System.out.println(s));
}
}
简化过程:
题目
需求
某影院系统需要在后台存储上述三部电影,然后依次展示出来。
分析
①:定义一个电影类,定义一个集合存储电影对象。
②:创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
③:遍历集合中的3个对象,输出相关信息。
答案:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class test {
public static void main(String[] args) {
Collection<Movie> movies = new ArrayList<>();
movies.add(new Movie("001",9.0,"a"));
movies.add(new Movie("002",9.3,"b"));
movies.add(new Movie("003",5.0,"c"));
/* Iterator t = movies.iterator();
while(t.hasNext()){
Object movie =t.next();
Movie h =new Movie();
h= (Movie)movie;
System.out.println("名字 "+h.getName());
System.out.println("评分 "+h.getScore());
System.out.println("演员 "+h.getActor());
}*/
//方法一
/*for (Movie movie : movies) {
System.out.println("名字 "+movie.getName());
System.out.println("评分 "+movie.getScore());
System.out.println("演员 "+movie.getActor());
}*/
//方法二
movies.forEach(s->{
System.out.println("名字 "+s.getName());
System.out.println("评分 "+s.getScore());
System.out.println("演员 "+s.getActor());
});
//方法三
}
}
运行结果:
名字 001
评分 9.0
演员 a
名字 002
评分 9.3
演员 b
名字 003
评分 5.0
演员 c
问题:
1、数组和集合的元素存储的个数问题。
数组定义后类型确定,长度固定
集合类型可以不固定,大小是可变的。
2、数组和集合存储元素的类型问题。
数组可以存储基本类型和引用类型的数据。
集合只能存储引用数据类型的数据。
3、数组和集合适合的场景
数组适合做数据个数和类型确定的场景。
集合适合做数据个数不确定,且要做增删元素的场景,集合种类更多,功能更强大。
4、集合的代表是?
Collection接口。
5、Collection集合分了哪2大常用的集合体系?
List系列集合:添加的元素是有序、可重复、有索引。
Set系列集合:添加的元素是无序、不重复、无索引。
6、如何约定集合存储数据的类型,需要注意什么?
集合支持泛型。
集合和泛型不支持基本类型,只支持引用数据类型。
7、迭代器的默认位置在哪里。
Iterator iterator():得到迭代器对象,默认指向当前集合的索引0
8、迭代器如果取元素越界会出现什么问题。
会出现NoSuchElementException异常。
9、增强for可以遍历哪些容器?
既可以遍历集合也可以遍历数组。
10、增强for的关键是记住它的遍历格式
for(元素数据类型 变量名 : 数组或者Collection集合) {
//在此处使用变量即可,该变量就是元素
}
11、集合中存储的是元素的什么信息?
集合中存储的是元素对象的地址。