7.16 Java基础 | 集合框架(上)
今天我看的菜鸟教程学的,也看了一些相关视频,下边把整体的框架大概总结一下,以便以后复习。
目录
【1】主体:
一、核心接口(Interfaces)
二、实现类(Classes)
三、工具类(Utility Classes)
四、迭代器(Iterator)
五、框架特点
【2】细分:
ArrayList常用方法:
一、基本操作方法
二、查找与判断方法
三、集合转换方法
四、迭代与遍历方法
五、其他常用方法
示例代码
注意事项
【3】排序
数组排序:
1、普通升序排序
2、自定义排序
3、lambda实现升序
集合排序:
【4】Set集合
Set常用方法:
蓝桥云课题目练习:
提示:
【5】Map集合
明天继续.....
【1】主体:
集合框架重点:
List Set Map Stack Queue
集合框架可以直接使用各种数据结构和算法,更加高效,这是我们选择使用它的原因。
Collection接口与集合框架的关系:
1、Collection接口是集合框架层次结构的根接口,子接口有:
List接口 Set接口 Queue接口 Map接口 Iterator接口
一、核心接口(Interfaces)
这些接口定义了集合的基本行为,是框架的基础:
Collection:所有集合类的根接口,定义了通用操作(如添加、删除、遍历元素等)。
- 主要子接口:
- List:有序集合(元素有索引),允许重复元素,支持随机访问。
- 典型实现类:
ArrayList
、LinkedList
、Vector
等。- Set:无序集合(无索引),不允许重复元素(通过
equals()
和hashCode()
判断)。
- 典型实现类:
HashSet
、TreeSet
(有序)、LinkedHashSet
(保持插入顺序)等。- Queue:队列接口,遵循 “先进先出(FIFO)” 原则,用于处理排队元素。
- 典型实现类:
LinkedList
(双端队列)、PriorityQueue
(优先级队列)等。- Deque:双端队列接口,允许在两端添加 / 删除元素,扩展了
Queue
。
- 典型实现类:
ArrayDeque
、LinkedList
等。Map:键值对(Key-Value)集合,键(Key)唯一,值(Value)可重复,与
Collection
接口并列(不属于其子接口)。
- 典型实现类:
HashMap
、TreeMap
(按键排序)、LinkedHashMap
(保持插入顺序)、Hashtable
等。
二、实现类(Classes)
基于上述接口的具体实现,提供了不同的数据结构特性:
接口 | 实现类 | 核心特点 |
---|---|---|
List | ArrayList | 基于动态数组,查询快(随机访问),增删慢(需移动元素) |
LinkedList | 基于双向链表,增删快(无需移动元素),查询慢(需遍历) | |
Vector | 线程安全的动态数组(效率较低,已被 ArrayList 替代) | |
Set | HashSet | 基于哈希表,无序,查询 / 增删效率高(平均 O (1)) |
TreeSet | 基于红黑树,元素自然排序或自定义排序,查询 / 增删效率 O (log n) | |
LinkedHashSet | 继承 HashSet ,通过链表保持插入顺序,兼具哈希表和链表特性 | |
Queue | PriorityQueue | 基于堆结构,元素按优先级排序(默认自然排序) |
Deque | ArrayDeque | 基于动态数组的双端队列,效率高于 LinkedList |
Map | HashMap | 基于哈希表,键无序,查询 / 增删效率高(非线程安全) |
TreeMap | 基于红黑树,键自然排序或自定义排序,支持按范围查询 | |
LinkedHashMap | 继承 HashMap ,通过链表保持键的插入顺序或访问顺序(可实现 LRU 缓存) | |
Hashtable | 线程安全的哈希表(效率低,已被 ConcurrentHashMap 替代) |
三、工具类(Utility Classes)
提供对集合的操作方法,简化开发:
- Collections:针对
Collection
和Map
的工具类,包含排序(sort()
)、查找(binarySearch()
)、同步化(synchronizedList()
)等静态方法。- Arrays:用于数组操作的工具类,可将数组转换为集合(
asList()
),也提供排序、查找等方法。
四、迭代器(Iterator)
用于遍历集合元素的接口,避免暴露集合内部结构:
Iterator
:所有Collection
集合的迭代器,支持hasNext()
(判断是否有下一个元素)、next()
(获取下一个元素)、remove()
(删除当前元素)。ListIterator
:List
接口特有的迭代器,支持双向遍历和修改元素(如add()
、set()
)。
五、框架特点
- 统一性:通过接口定义统一行为,不同实现类可灵活替换。
- 高效性:针对不同场景提供优化实现(如
ArrayList
适合查询,LinkedList
适合增删)。 - 扩展性:允许自定义集合类,只需实现相应接口即可融入框架。
【2】细分:
ArrayList常用方法:
一、基本操作方法
添加元素
add(Eelement)
:将元素添加到列表末尾。add(int index, E element)
:在指定索引位置插入元素(原元素后移)。addAll(Collection<? extends E> c)
:将另一个集合的所有元素添加到列表末尾。addAll(int index, Collection<? extends E> c)
:从指定索引开始插入另一个集合的元素。获取元素
get(int index)
:返回指定索引位置的元素。size()
:返回列表中元素的数量。isEmpty()
:判断列表是否为空。删除元素
remove(int index)
:删除指定索引位置的元素,并返回被删除的元素。remove(Object o)
:删除列表中第一个出现的指定元素(通过equals()
判断)。removeAll(Collection<?> c)
:删除列表中所有包含在指定集合中的元素。clear()
:清空列表中的所有元素。修改元素
set(int index, E element)
:替换指定索引位置的元素为新元素,并返回原元素。二、查找与判断方法
查找元素位置
indexOf(Object o)
:返回指定元素第一次出现的索引,若不存在则返回 - 1。lastIndexOf(Object o)
:返回指定元素最后一次出现的索引,若不存在则返回 - 1。判断元素存在
contains(Object o)
:判断列表是否包含指定元素(通过equals()
判断)。containsAll(Collection<?> c)
:判断列表是否包含指定集合中的所有元素。三、集合转换方法
转换为数组
toArray()
:返回包含列表所有元素的Object[]
数组。toArray(T[] a)
:返回包含列表所有元素的指定类型数组(需传入同类型空数组)。转换为其他集合
- 可通过构造函数转换为其他集合,例如:
java
List<String> list = new ArrayList<>(); Set<String> set = new HashSet<>(list); // 将ArrayList转换为HashSet
四、迭代与遍历方法
迭代器
iterator()
:返回用于遍历列表的Iterator
迭代器。listIterator()
:返回支持双向遍历的ListIterator
迭代器。遍历示例
java
ArrayList<String> list = new ArrayList<>(); // 方式1:普通for循环(通过索引) for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); } // 方式2:增强for循环 for (String element : list) {System.out.println(element); } // 方式3:迭代器(支持删除操作) Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) {System.out.println(iterator.next());iterator.remove(); // 删除当前元素 } // 方式4:Java 8 Stream API list.forEach(element -> System.out.println(element));
五、其他常用方法
调整容量
trimToSize()
:将列表的容量调整为当前元素数量,减少内存占用。ensureCapacity(int minCapacity)
:确保列表的容量至少为指定值,避免频繁扩容。截取子列表
subList(int fromIndex, int toIndex)
:返回从fromIndex
(包含)到toIndex
(不包含)的子列表(视图,非复制)。排序
sort(Comparator<? super E> c)
:根据指定比较器对列表元素进行排序(Java 8+)。java
list.sort((a, b) -> a.compareTo(b)); // 升序排序
示例代码
java
import java.util.ArrayList; import java.util.List;public class ArrayListExample {public static void main(String[] args) {// 创建ArrayList并添加元素List<String> fruits = new ArrayList<>();fruits.add("Apple");fruits.add("Banana");fruits.add(1, "Cherry"); // 在索引1处插入元素// 获取元素System.out.println(fruits.get(0)); // 输出:AppleSystem.out.println(fruits.size()); // 输出:3// 修改元素fruits.set(1, "Blueberry");// 删除元素fruits.remove("Banana");// 判断元素存在System.out.println(fruits.contains("Apple")); // 输出:true// 遍历元素for (String fruit : fruits) {System.out.println(fruit);}} }
注意事项
- 线程安全:
ArrayList
是非线程安全的,若需在多线程环境使用,可改用Vector
或通过Collections.synchronizedList()
包装。- 性能特点:适合随机访问(
get
/set
效率高),但插入 / 删除操作在中间位置效率较低(需移动元素)。
【3】排序
数组排序:
1、普通升序排序
Arrays.sort(int []a);
2、自定义排序
Arrays.sort(int []a,comparator<T>c);
package day716; import java.util.Arrays; import java.util.Comparator; public class 数组列表排序 {public static void main(String[] args) {Integer[] a= {3,21,56,3,67,8,5,4};//sort()排序Arrays.sort(a); for(int i:a) { System.out.print(i+" "); }//自定义排序Arrays.sort(a,new Comparator<Integer>(){@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});for(int i:a) { System.out.print(i+" "); }} }
3、lambda实现升序
Array.sort(T[] arr,(o1,o2)->o1-o2)升序
Array.sort(T[] arr,(o1,o2)->o2-o1)降序
//lamadaArrays.sort(a,(o1,o2)->o2-o1);for(int i:a) { System.out.print(i+" "); }System.out.println(" ");Arrays.sort(a,(o1,o2)->o1-o2);for(int i:a) { System.out.print(i+" "); }System.out.println(" ");
集合排序:
Collections.sort(List<> arr) 所有元素从小到大排序
package day716; import java.util.*;public class 集合排序 {public static void main(String[] args) {List<Integer>list =new ArrayList<>();list.add(3);list.add(78);list.add(22);list.add(12);list.add(4);//法一Collections.sort(list);for(int i:list) {System.out.println(i);}//法二Collections.sort(list,(o1,o2)->o2-o1);for(int i:list) {System.out.print(i+" ");}} }
【4】Set集合
Set集合可以用来去重:这里的Set集合与数学上的集合类似,不能存储重复的元素,且元素无序。
Set常用方法:
add()
size()
remove()
contains()
clear()
package day716; import java.util.*; public class Set集合去重 {public static void main(String[] args) {Set<Integer>set=new HashSet<>();boolean a=set.add(1);//add返回true or falseboolean b=set.add(2);System.out.println(a+" "+b);System.out.println(set);System.out.println(set.size());//集合大小boolean c=set.remove(1);//删除1 这个元素System.out.println(set);boolean d=set.contains(1);//查看是否包含元素1System.out.println(d);set.clear();System.out.println(set);} }
蓝桥云课题目练习:
提示:
(1)输入数据
(2)定义HashSet<>()用来去重
(3)定义ArrayList<>()用来排序
【5】Map集合
Map 集合是一种能存储键值对的数据结构。它的主要功能是依据键(Key)来快速查找对应的值(Value)