集合框架和泛型
1.Collection集合
1.1数组和集合的区别
-
相同点
都是容器,可以存储多个数据
-
不同点
-
数组的长度是不可变的,集合的长度是可变的
-
数组可以存基本数据类型和引用数据类型
集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
-
1.2集合体系结构图
1.3Collection 集合概述
-
是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
-
JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现
1.4Collection集合常用方法
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
boolean removeIf(Object o) | 根据条件进行移除 |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中元素的个数 |
2.List集合
2.1List集合的概述和特点
-
List集合的概述
-
有序集合,这里的有序指的是存取顺序
-
用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
-
与Set集合不同,列表通常允许重复的元素
-
-
List集合的特点
-
存取有序
-
可以重复
-
有索引
-
-
List接口的实现类
-
ArrayList集合
底层是数组结构实现,查询快、增删慢
-
LinkedList集合
底层是链表结构实现,查询慢、增删快
-
2.2ArrayList集合类
-
ArrayList类是List接口的一个具体实现类
-
ArrayList对象实现了可变大小的数组
-
随机访问和遍历元素时,它提供更好的性能
ArrayList常用方法
方法名 | 说明 |
---|---|
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
2.3.LinkedList集合类
-
LinkedList类是List接口的一个具体实现类
-
LinkedList 类用于创建链表数据结构
-
插入或者删除元素时,它提供更好的性能
LinkedList常用方法
方法名 | 说明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
2.4List集合的遍历方式
Car car1 = new Car("宝马", "X5", "京A88888", 300000); Car car2 = new Car("奔驰", "S500", "京A88889", 300000); Car car3 = new Car("奥迪", "A6", "京A88890", 200000); List<Car> cars = new ArrayList<Car>(); cars.add(car1); cars.add(car2); cars.add(car3); System.out.println("使用迭代器循环打印汽车信息"); Iterator<Car> iterator = cars.iterator(); while (iterator.hasNext()) { Car car = iterator.next(); System.out.println(car.toString()); } System.out.println("使用增强for循环打印汽车信息"); for (Car car : cars) { System.out.println(car.toString()); }
3.Set集合
3.1Set集合概述和特点
-
不可以存储重复元素
-
没有索引,不能使用普通for循环遍历
3.2HashSet集合类
-
底层数据结构是哈希表
-
存取无序
-
不可以存储重复元素
-
没有索引,不能使用普通for循环遍历
3.3TreeSet集合类
-
不可以存储重复元素
-
没有索引
-
可以将元素按照规则进行排序
-
TreeSet():根据其元素的自然排序进行排序
-
TreeSet(Comparator comparator) :根据指定的比较器进行排序
-
3.4Set集合的遍历方式
-
迭代器遍历
-
增强for遍历
Student stu1 = new Student("liusan", 25, 90.0F); Student stu2 = new Student("lisi", 21, 90.0F); Student stu3 = new Student("wangwu", 20, 99.0F); Student stu4 = new Student("sunliu", 22, 100.0F); Set<Student> set = new TreeSet<Student>(); set.add(stu1); set.add(stu2); set.add(stu3); set.add(stu4); System.out.println("增强for打印集合"); for (Student student : set) { System.out.println(student.toString()); } System.out.println("迭代器打印集合"); Iterator<Student> it = set.iterator(); while (it.hasNext()) { System.out.println(it.next().toString()); }
4.Map集合
4.1Map集合概述和特点
-
双列集合,一个键对应一个值
-
键不可以重复,值可以重复
4.2HashMap集合类
-
HashMap底层是哈希表结构
-
依赖hashCode方法和equals方法保证键的唯一
-
如果键要存储的是自定义对象,需要重写hashCode和equals方法
4.3TreeMap集合
-
TreeMap底层是红黑树结构
-
依赖自然排序或者比较器排序,对键进行排序
-
如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则
4.4Map集合常用方法
方法名 | 说明 |
---|---|
Object put(Object key, Object val) | 以“键-值”对的方式进行存储 |
Object get(Object key) | 根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove(Object key) | 删除由指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet() | 返回键的集合 |
Collection values() | 返回值的集合 |
boolean containsKey(Object key) | 如果存在由指定的键映射的“键-值对”,返回true |
Set<Map.Entry<K,V>> entrySet() | 获取所有键值对对象的集合 |
4.5Map集合的遍历方式
-
通过键的集合来遍历
-
获取所有键的集合。用keySet()方法实现
-
遍历键的集合,获取到每一个键。用增强for实现
-
根据键去找值。用get(Object key)方法实现
-
-
通过键值对的集合来遍历
-
获取所有键值对对象的集合
-
Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
-
-
遍历键值对对象的集合,得到每一个键值对对象
-
用增强for实现,得到每一个Map.Entry
-
-
根据键值对对象获取键和值
-
用getKey()得到键
-
用getValue()得到值
-
-
Map<Integer,String> map = new HashMap<Integer, String>(); map.put(1, "张三丰"); map.put(2, "周芷若"); map.put(3, "汪峰"); map.put(4, "灭绝师太"); //用键的集合去找值来遍历 Set<Integer> keySet = map.keySet(); System.out.println("用键的集合去找值来遍历"); for (Integer key : keySet) { System.out.println(key + ":" + map.get(key)); } System.out.println("___________________"); //用键值对的方式遍历 System.out.println("用键值对的方式遍历"); for (Map.Entry<Integer, String> entry : map.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } map.put(5,"李晓红"); map.remove(1); map.put(2,"周林");
5.集合的泛型
-
泛型的介绍
泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制
-
泛型的好处
-
把运行时期的问题提前到了编译期间
-
避免了强制类型转换
-
-
泛型的定义格式
-
<类型>: 指定一种类型的格式,尖括号里面可以任意书写例如
-
<类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开
Map<Integer,String> map = new HashMap<Integer, String>();
-
6.Collections算法类
-
Java集合框架将针对不同数据结构算法的实现都保存在工具类中
-
Collections类定义了一系列用于操作集合的静态方法
-
Collections和Collection不同,前者是集合的操作类,后者是集合接口
-
Collections提供的常用静态方法
-
sort():排序
-
max()\min():查找最大\最小值
-
-
实现一个类的对象之间比较大小,该类要实现Comparable接口
-
根据compareTo方法的返回值大小来进行排序
package Demo3; /** * @author Advancer * @version 1.0.0 * @ClassName Demo3.Student.java * @Description * @createTime 2024年08月12日 09:42 */ public class Student implements Comparable<Student> { String name; int age; float score; public Student() { } + public Student( String name,int age, float score) { this.age = age; this.name = name; this.score = score; } @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + ", score=" + score + '}'; } @Override public int compareTo(Student o) { //主要判断条件: 按照成绩从高到低排列 float result=o.score-this.score; //次要判断条件: 年龄相同时,按照姓名的字母顺序排序 result=result==0?this.name.compareTo(o.name):result; return (int)result; } }