目录
一、集合和数组类似,都是容器。为什么集合呢?
1、数组的特点:
a.数组定义完成并启动后,类型确定、长度固定。
b.不适合元素的个数和类型不确定的业务场景,更不适合做需要增删数据操作。
c.数组的功能也比较的单一,处理数据的能力并不是很强大。
2、集合的特点:
a.集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。
b.集合非常适合元素个数不能确定,且需要做元素的增删操作的场景。
c.集合提供的种类特别的丰富,功能也是非常强大的,开发中集合用的更多。
二、集合的体系特点
1、集合类体系结构
a.Collection单列集合:每个元素(数据)只包含一个值。
b.Map双列集合:每个元素包含两个值(键值对)。
2、Collection集合体系
a.List系列集合:添加的元素是有序、可重复、有索引。
ArrayList、LinekdList :有序、可重复、有索引。
b.Set系列集合:添加的元素是无序、不重复、无索引。
HashSet: 无序、不重复、无索引。
LinkedHashSet: 有序、不重复、无索引。
TreeSet:按照大小默认升序排序、不重复、无索引。
3、泛型
集合都是泛型的形式,可以在编译阶段约束集合只能操作某种数据类型。
Collection<String> lists = new ArrayList<String>();
Collection<String> lists = new ArrayList<>(); // JDK 1.7开始后面的泛型类型申明可以省略不写
注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
三、Collection集合常用API
1、Collection集合
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
2、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() | 把集合中的元素,存储到数组中 |
四、Collection集合的遍历方式
1、方式一:迭代器
1.1、迭代器遍历概述
a.遍历就是一个一个的把容器中的元素访问一遍。
b.迭代器在Java中的代表是Iterator,迭代器是集合的专用的遍历方式。
1.2、Collection集合获取迭代器
方法名称 | 说明 |
Iterator<E> iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引 |
1.3、Iterator中的常用方法
方法名称 | 说明 |
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true ,不存在返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。 |
1.4、代码
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("小王");
c.add("小丁");
c.add("小陈");
c.add("小李");
System.out.println(c);
Iterator<String> i = c.iterator();
while (i.hasNext()){
String s = i.next();
System.out.println(s);
}
}
1.5、结果展示
2、方式二:for each/增强for循环
1.1、增强for可以遍历哪些容器?
既可以遍历集合也可以遍历数组。
1.2、增强for的关键是记住它的遍历格式
for(元素数据类型 变量名 : 数组或者Collection集合) {
//在此处使用变量即可,该变量就是元素
}
1.3、代码
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("小王");
c.add("小丁");
c.add("小陈");
c.add("小李");
System.out.println(c);
System.out.println("----------遍历集合----------");
for (String s : c) {
System.out.println(s);
}
System.out.println("----------遍历数组----------");
double[] scores = {100, 99, 56, 59.2};
for (double s : scores) {
System.out.println(s);
// if(s == 56){
// s = 100; //修改无意义 ,不会改变数组中的值(人家数组该是多少还是多少!!)
// }
}
System.out.println(Arrays.toString(scores));
}
1.4、结果展示
3、方式三:lambda表达式
3.1、Lambda表达式遍历集合
得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
3.2、Collection结合Lambda遍历的API
方法名称 | 说明 |
default void forEach(Consumer<? super T> action): | 结合lambda遍历集合 |
3.3、代码
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("小王");
c.add("小丁");
c.add("小陈");
c.add("小李");
System.out.println(c);
c.forEach(System.out::println);
}
3.4、结果展示
五、Collection集合存储自定义类型的对象
1、需求
某影院系统需要在后台存储上述三部电影,然后依次展示出来。
2、分析
a:定义一个电影类,定义一个集合存储电影对象。
b:创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
c:遍历集合中的3个对象,输出相关信息。
3、代码
3.1、实体类
public class Movie {
private String name;
private Double grade;
private String actor;
public Movie() {
}
public Movie(String name, Double grade, String actor) {
this.name = name;
this.grade = grade;
this.actor = actor;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getGrade() {
return grade;
}
public void setGrade(Double grade) {
this.grade = grade;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
}
3.2、主程序
public static void main(String[] args) {
//1、定义一个电影类
//2、定义一个集合对象存储三部电影
ArrayList<Movie> movies = new ArrayList<>();
movies.add(new Movie("《你好,李焕英》",9.5,"小张"));
movies.add(new Movie("《唐人街探案》",8.5,"小王"));
movies.add(new Movie("《刺杀小说家》",8.6,"小雷"));
//3、遍历出集合中的对象
for (Movie movie : movies) {
System.out.println(movie.getName());
System.out.println(movie.getGrade());
System.out.println(movie.getActor());
}
}