文章目录
一、集合概述
集合框架类图
1、集合的特点
- 集合大小不固定,类型也可以选择不固定。
- 集合适合做元素的增删操作。
注意:集合中只能存储引用类型数据,如果要存储基本类型数据可以选用包装类。
2、集合适合的场景
- 数据的个数不确定,需要进行增删”元素时。
二、Collection集合的体系特点
1、集合类体系结构
- Collection单列集合,每个元素(数据)只包含一个值。
- Map双列集合,每个元素包含两个值(键值对)。
2、Collection集合特点
List系列集合
:添加的元素是有序、可重复、有索引。- ArrayList、LinkedList:有序、可重复、有索引。
Set系列集合
:添加的元素是无序、不重复、无索引。- HashSet:无序、不重复、无索引。
- LinkedHashSet:
有序
、不重复、无索引。 - TreeSet:
按照大小默认升序排序
、不重复、无索引。
3、集合对于泛型的支持
- 集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型。
注意:集合和泛型都只支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
三、Collection集合常用API
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**
* 掌握 Collection集合常用API
*/
public class Test {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
System.out.println("---------添加元素--------");
c.add("Java");
c.add("Python");
c.add("C#");
c.add("C++");
c.add("Go");
System.out.println(c);
System.out.println("---------清空集合--------");
// c.clear();
// System.out.println(c);
System.out.println("---------判空--------");
System.out.println(c.isEmpty());
System.out.println("----------获取集合大小-------");
System.out.println(c.size());
System.out.println("---------删除某个元素--------");
c.remove("C++");
System.out.println(c);
System.out.println("---------集合 -> 数组--------");
Object[] arr = c.toArray();
System.out.println(Arrays.toString(arr));
System.out.println("------------扩展--------------");
Collection<String> c1 = new ArrayList<>();
c1.add("HTML");
c1.add("CSS");
//将c1的元素装入c中
c.addAll(c1);
System.out.println(c);
System.out.println(c1);
}
}
四、Collection集合的遍历方式
1、方式一:迭代器(Iterator)
- 集合的专用遍历方式
Collection集合获取迭代器
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* Collection集合获取迭代器
*/
public class CollectionDemo1 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
System.out.println("---------添加元素--------");
c.add("Java");
c.add("Python");
c.add("C#");
c.add("C++");
c.add("Go");
System.out.println(c);
System.out.println("-----------------------");
// 得到当前集合的迭代器对象
Iterator<String> it = c.iterator();
// 从迭代器中取出一个元素
// System.out.println(it.next());
while (it.hasNext()){
System.out.println(it.next());
}
}
}
2、方式二:foreach / 增强for循环
- 增强for循环:(既可遍历集合,也可遍历数组)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* foreach遍历
*/
public class CollectionDemo2 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("Java");
c.add("Python");
c.add("C#");
c.add("C++");
c.add("Go");
System.out.println(c);
System.out.println("-----------------------");
// 增强for循环遍历集合:
for (String str : c){
System.out.println(str);
}
System.out.println("-----------------------");
int[] arr1 = {1,4,2,5,3};
// 同样,增强for循环遍历数组:
for (int arr : arr1){
System.out.println(arr);
}
}
}
五、Collection集合存储自定义类型对象
import java.util.ArrayList;
import java.util.Collection;
/**
* 需求:用集合存储三部电影信息,遍历展示
* 1、《肖生克的救赎》 9.7 蒂姆·罗宾斯
* 2、《霸王别姬》 9.6 张国荣
* 3、《阿甘正传》 9.5 汤姆·汉克斯
*/
public class CollectionDemo_Test {
public static void main(String[] args) {
Collection<Movie> list = new ArrayList<>();
list.add(new Movie("《肖生克的救赎》",9.7,"蒂姆·罗宾斯"));
list.add(new Movie("《霸王别姬》 ",9.6,"张国荣"));
list.add(new Movie("《阿甘正传》",9.5,"汤姆·汉克斯"));
list.forEach(movie -> {
System.out.println("名称:"+movie.getName()
+"\n评分:"+movie.getPoint()+"\n主演:"+movie.getActor());
System.out.println("---------------------");
});
}
}
六、List系列集合
1、List系列集合特点
- ArrayList.LinekdList:有序,可重复,有索引。
- 有序:存储和取出的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
import java.util.ArrayList;
import java.util.List;
/**
* List集合特有方法
*/
public class ListDemo1 {
public static void main(String[] args) {
// 1、创建一个 ArrayList 集合对象
List<String> list = new ArrayList<>();
// 2、添加元素
list.add("Java");
list.add("Python");
list.add("C++");
list.add("Mysql");
// 3、根据索引插入元素
list.add(2,"Go");
// 4、根据索引删除元素
list.remove(2);
// 5、根据索引获取元素
System.out.println(list.get(2));
// 6、修改指定索引的元素值
list.set(2,"Go");
}
}
2、List集合的遍历方式
- 迭代器
- 增强for循环
- Lambda表达式
- for循环(因为List集合存在索引)
3、ArrayList集合底层原理
- ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
- 第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。
4、LinkedList集合的底层原理
- 底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
七、Map集合体系
1、Map集合的概述
2、Map集合体系特点
3、常用API
4、遍历方式一:键找值
- 先获取Map集合的全部键的Set集合。
- 遍历键的Set集合,然后通过键提取对应值。
Map<String, Integer> maps = new HashMap<>();
maps.put("Java",12);
maps.put("Python",32);
maps.put("C++",22);
maps.put("Go",12);
System.out.println(maps);
/*----------遍历方式一:键找值--------*/
// 1、取出所有键
Set<String> key = maps.keySet();
// 2、遍历集合,根据键取出键对应的值
Collection<Integer> values = new ArrayList<>();
for (String s : key) {
values.add(maps.get(s));
}
System.out.println(values);
5、遍历方式二:键值对
- 先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了。
- 遍历Set集合,然后提取键以及提取值。
Map<String, Integer> maps = new HashMap<>();
maps.put("Java",12);
maps.put("Python",32)
maps.put("C++",22);
maps.put("Go",12);
System.out.println(maps);
/*----------遍历方式二:键值对--------*/
// 1、通过entrySet()方法把Map集合转化成Set集合
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
// 2、使用foreach遍历
Collection<Integer> values1 = new ArrayList<>(); // 可重复
for (Map.Entry<String, Integer> entry : entries) {
String key1 = entry.getKey();
Integer value = entry.getValue();
values1.add(value);
}
System.out.println(values1);
八、Set系列集合
1、Set系列集合特点
- 无序:存取顺序不一致
- 不重复:可以去除重复
- 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。
2、Set集合实现类特点
- HashSet :无序、不重复、无索引。
- LinkedHashSet:
有序
、不重复、无索引。 - Treeset:
排序
、不重复、无索引。
Set集合的功能基本上与Collection的API一致
九、集合排序
Collection的排序相关API:只对于LIst集合
十、补充:Collection体系的特点、使用场景总结
十一、泛型
1、泛型概述
- 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
- 泛型的格式:<数据类型>;注意:泛型只能支持引用数据类型。
- 集合体系的全部接口和实现类都是支持泛型的使用的。
2、泛型的好处
- 统一数据类型。
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
3、自定义泛型类
泛型类概述
- 定义类时同时定义了泛型的类就是泛型类。
- 泛型类的格式:修饰符class类名<泛型变量>{}
-
public class MyArrayList<T>{}
- 此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。
- 作用:编译阶段可以指定数据类型,类似于集合的作用。
4、自定义泛型方法
泛型方法的概述
- 定义方法时同时定义了泛型的方法就是泛型方法。
- 泛型方法的格式∶修饰符<泛型变量>方法返回值方法名称(形参列表)用
-
public <T> void show(T t){ }
- 作用:方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。
5、自定义泛型接口
- 使用了泛型定义的接口就是泛型接口。
- 泛型接口的格式:修饰符interface接口名称<泛型变量>{}
-
public interface Data<E>{}
- 作用:泛型接口可以让实现类选择当前功能需要操作的数据类型
6、泛型通配符、上下限
通配符: ?
- ? 可以在“使用泛型”的时候代表一切类型。
- E T K V 是在定义泛型的时候使用的。
泛型的上下限
- ? extends Car : ? 必须是Car或者其子类 泛型上限
- ? super Car : ? 必须是Car或者其父类 泛型下限