先理解一下数组与集合的关系:
集合和数组类似,都是容器
1、数组和集合的元素存储的个数问题。
数组定义后类型确定,长度固定
集合类型可以不固定,大小是可变的。
2、数组和集合存储元素的类型问题。
数组可以存储基本类型和引用类型的数据。
集合只能存储引用数据类型的数据。
3、数组和集合适合的场景
数组适合做数据个数和类型确定的场景。
集合适合做数据个数不确定,且要做增删元素的场景,集合种类更多,功能更强大。
一、集合体系
- Collection单列集合,每个元素(数据)只包含一个值。
- Map双列集合,每个元素包含两个值(键值对)。
集合都是泛型的形式,可以在编译阶段约束集合只能操作某种数据类型
集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象
二、Collection集合常用API
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() | 返回集合中元素的个数。 |
public Object[] toArray() | 把集合中的元素,存储到数组中 |
c1.addAll(c2) | 把c2集合的元素全部倒入到c1中去。 |
三、Collection集合迭代器遍历方式
1.1 迭代器方式
- 遍历就是一个一个的把容器中的元素访问一遍。
- 迭代器在Java中的代表是Iterator,迭代器是集合的专用的遍历方式。
ArrayList<String> lists = new ArrayList<>();
lists.add("赵敏");
lists.add("小昭");
// 1、得到当前集合的迭代器对象。
Iterator<String> it = lists.iterator();
// 2、定义while循环
while (it.hasNext()){ //hasNext()询问当前位置是否有元素存在,存在返回true ,不存在返回false
String ele = it.next();//获取当前位置的元素,并同时将迭代器对象移向下一个位置
System.out.println(ele);
}
迭代器如果取元素越界,会出现NoSuchElementException异常
1.2 foreach/增强for循环
增强for循环:既可以遍历集合也可以遍历数组。
for (String ele : lists) {
System.out.println(ele);
}
1.3 lambda表达式
lists.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//等价于
lists.forEach( s-> {
System.out.println(s);
});
1.3 Collection集合存储自定义类型的对象
// 1、定义一个电影类
// 2、定义一个集合对象存储3部电影对象
Collection<Movie> movies = new ArrayList<>();
movies.add(new Movie("《你好,李焕英》", 9.5, "张小斐,贾玲,沈腾,陈赫"));
movies.add(new Movie("《唐人街探案》", 8.5, "王宝强,刘昊然,美女"));
movies.add(new Movie("《刺杀小说家》",8.6, "雷佳音,杨幂"));
System.out.println(movies);
// 3、遍历集合容器中的每个电影对象
for (Movie movie : movies) {
System.out.println("片名:" + movie.getName());
System.out.println("得分:" + movie.getScore());
System.out.println("主演:" + movie.getActor());
}