一、集合概述
集合和数组都是容器
数组
特点:数组定义完成并启动后,类型确定、长度固定。
劣势:在进行增删数据操作的时候,数组是不太合适的,增删数据都需要放弃原有数组或者移位。
使用场景:当业务数据的个数是固定的,且都是同一批数据类型的时候,可以采取定义数组存储。
集合
集合是Java中存储对象数据的一种容器。
特点:集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像是一个气球
优势:非常适合做增删数据的操作。
使用场景:当业务数据的个数不固定,且需要进行增删数据的时候,可以采取定义集合存储。
注意:集合中只能存储引用类型数据,如果要存储基本类型数据可以选用基本类型对应的包装类。
总结
数组和集合的元素存储的个数问题?
- 数组定义后类型确定,长度固定;
- 集合类型可以固定,大小可变。
数组和集合存储元素的类型问题?
- 数组可以存储基本类型和引用类型的数据;
- 集合只能存储引用类型的数据,如果想要存储解基本类型的数据,可以选用基本类型对应的包装类。
数组和集合适合的场景?
- 当业务数据的个数确定、类型确定的时候,可以采取定义数组存储;
- 当业务数据的个数不固定,且需要对数据进行增删操作的时候,可以采取定义集合存储。
二、Collection集合的体系特点
1.集合类体系结构
collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。
注意:前期先掌握Collection集合体系的使用。
2.Collection集合体系
3.Collection集合特点
List系列集合:添加的元素是有序的,可重复的,有索引
ArrayList、LinkedList
Set系列集合:添加的元素是无序的,不重复的,无索引
Hash Set:无序不重复无索引
LinkedHashSet:有序不重复无索引
TreeSet:按大小默认升序排序不重复无索引
public static void main(String[] args) {
// List系列:有序可重复有索引
Collection arr = new ArrayList();
arr.add("test");
arr.add("test");
arr.add(1);
arr.add(1);
System.out.println("List系列:"+arr);
// Set系列:无序不重复无索引
Collection hashSet = new HashSet();
hashSet.add("test");
hashSet.add("test");
hashSet.add(11);
hashSet.add(11);
System.out.println("Set系列:"+hashSet);
}
控制台输出结果:
4.集合对于泛型的支持
集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型
Collection<String> lists = new ArrayList<String>();
Collection<String> lists1 = new ArrayList<>(); // JDK 1.7开始后面的泛型类型申明可以省略不写
集合和泛型都只支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
如果集合中要存储基本类型的数据,需要使用对应的包装类
Collection<Integer> lists1 = new ArrayList<>(); // 存储基本类型的数据需要使用对应的包装类
Collection<Double> lists2 = new ArrayList<>(); // 存储基本类型的数据需要使用对应的包装类
public static void main(String[] args) {
// List系列:有序可重复有索引
Collection arr = new ArrayList();
arr.add("test");
arr.add("test");
arr.add(1);
arr.add(1);
System.out.println("List系列:"+arr);
// Set系列:无序不重复无索引
Collection hashSet = new HashSet();
hashSet.add("test");
hashSet.add("test");
hashSet.add(11);
hashSet.add(11);
System.out.println("Set系列:"+hashSet);
// 集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型
// Collection<String> list01 = new ArrayList<>(String);在jdk7后,右边的类型申明可以忽略不写
Collection<String> list01 = new ArrayList<>();
list01.add("java");
list01.add("java");
list01.add("李白");
list01.add("汪汪头");
list01.add("汪汪头");
System.out.println(list01);
Collection<String> list02 = new HashSet<>();
list02.add("java");
list02.add("java");
list02.add("李白");
list02.add("汪汪头");
list02.add("汪汪头");
System.out.println(list02);
// 如果集合中要存储基本类型的数据,需使用对应的包装类来申明集合类型
Collection<Integer> list03 = new ArrayList<>();
list03.add(15);
list03.add(15);
list03.add(256);
list03.add(256);
list03.add(512);
System.out.println(list03);
Collection<Integer> list04 = new ArrayList<>();
list04.add(15);
list04.add(15);
list04.add(256);
list04.add(256);
list04.add(512);
System.out.println(list04);
}
总结
1.集合代表是?
Collection接口。
2.Collection集合分了哪两大常用的集合体系?
List系列的集合体系:添加的元素有序、可重复、有索引;
Set系列的集合体系:添加的元素无序、不重复、无索引。
注意:Set系列的集合,有些实现类可能会有些改变。
3.如何约定集合存储数据的类型,需要注意什么?
集合支持泛型;
集合和泛型不支持基本数据类型,只支持引用数据类型。
三、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 o) | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数 |
public boolean isEmpty() | 判断当前集合是否为空 |
public Object[]toArray() | 把集合中的所有元素,存储到数组中 |
public static void main(String[] args) {
//添加元素
Collection<String> list1 = new ArrayList<>();
list1.add("java");
list1.add("java");
list1.add("CTRL");
list1.add("三国演义");
System.out.println("List系列list1集合:"+list1);
//添加元素:因为set系列的集合:无序不重复无索引
Collection<Integer> list2 = new HashSet<>();
list2.add(123);
list2.add(123);//false
list2.add(321);
System.out.println("Set系列list2集合:"+list2);
System.out.println();
//把给定的对象在当前集合中删除,成功为true,失败为false
System.out.println("从list1集合中删除“CTRL”是否成功:"+list1.remove("CTRL"));
System.out.println("List系列list1集合:"+list1);
System.out.println("从list2集合中删除“123”是否成功:"+list2.remove(123));
System.out.println("Set系列list2集合:"+list2);
System.out.println();
//判断当前集合是否为空,为空true,不为空false
System.out.println("list1集合是否为空:"+list1.isEmpty());
System.out.println("list2集合是否为空:"+list2.isEmpty());
System.out.println();
//判断当前集合中是否包含给定的对象,包含true,否则false
System.out.println("list1集合中是否包含“java”:"+list1.contains("java"));
System.out.println("list2集合中是否包含“321“:"+list2.contains(321));
System.out.println();
//返回集合中元素的个数
System.out.println("list1集合中有"+list1.size()+"个元素");
System.out.println("list2集合中有"+list2.size()+"个元素");
System.out.println();
//把集合中的所有元素,存储到数组中
Object[] arr1 = list1.toArray();
Object[] arr2 = list2.toArray();
System.out.println();
System.out.println("list1集合"+list1);
System.out.println("list1存储到数组arr1后:"+ Arrays.toString(arr1));
System.out.println("list2集合"+list2);
System.out.println("list2存储到数组arr2后:"+Arrays.toString(arr2));
System.out.println();
// 清空集合中所有的元素
list1.clear();
System.out.println("list1集合:"+list1);
System.out.println("list2集合:"+list2);
System.out.println();
// 判断当前集合是否为空,为空true,否则false
System.out.println("list1集合是否为空:"+list1.isEmpty()); //true
System.out.println("list2集合是否为空:"+list2.isEmpty()); //false
System.out.println();
控制台输出结果:
四、Collection集合的遍历
1.迭代器
遍历就是一个一个的把容器中的元素访问一遍。
迭代器在Java中的代表是iterator,迭代器是集合的专用遍历方式。
(1)Collection集合获取迭代器
方法 | 说明 |
Iterator<E> iterator() | 返回当前集合中元素的迭代器,该迭代器对象默认指向当前集合的0索引 |
(2)Iterator中的常用API
方法 | 说明 |
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true,否则返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界 |
总结
1.迭代器的默认位置在哪里?
默认指向当前集合的索引0
2.迭代器如果取元素月结会出现什么问题?
会出现NoSuchElementException异常
2.foreach(增强版的for循环)
foreach:既可以遍历集合也可以遍历数组
它是jdk5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法。
实现Iterable接口的类才可以使用Iterator迭代器和foreach,Collection接口已经实现了Iterable接口
foreach格式:
for(元素数据类型 变量名 : 数组或者Collection集合) {
// 在此处使用变量即可,该变量就是元素
}
public static void main(String[] args) {
// 创建collection集合,添加几个元素
Collection<String> name = new ArrayList<>();
name.add("双面龟");
name.add("泡泡");
name.add("阿酷");
name.add("小美美");
System.out.println(name);
// 使用foreach遍历collection集合
for (String ele : name){
System.out.println(ele+"");
}
System.out.println("-------");
// 创建一个数组,添加几个元素
int[]scores = {100,456,13,78};
System.out.println(Arrays.toString(scores));
// 使用foreach遍历数组
for (double score : scores){
System.out.println(score+"\t");
}
}
控制台输出结果:
3.Lambda表达式
得益于jdk8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
方法 | 说明 |
defaulf void forEach(Consumer<?super T action) | 集合Lambda遍历集合 |
public static void main(String[] args) {
// 创建collection集合,添加几个元素
Collection<String> name = new ArrayList<>();
name.add("双面龟");
name.add("泡泡");
name.add("阿酷");
name.add("小美美");
System.out.println(name);
//
Lambda原形式
// name.forEach(new Consumer<String>() {
// @Override
// public void accept(String s) {
// System.out.println(s);
// }
// });
//
简化
// name.forEach(s -> {
// System.out.println(s);
// });
// 进一步简化
name.forEach(s -> System.out.println(s));
}
控制台输出结果: