今天我看的菜鸟教程学的,也看了一些相关视频,下边把整体的框架大概总结一下,以便以后复习。
目录
【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)); // 输出:Apple System.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>(){ @Override public 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)降序
//lamada Arrays.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 false boolean 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);//查看是否包含元素1 System.out.println(d); set.clear(); System.out.println(set); } }
蓝桥云课题目练习:
提示:
(1)输入数据
(2)定义HashSet<>()用来去重
(3)定义ArrayList<>()用来排序
【5】Map集合
Map 集合是一种能存储键值对的数据结构。它的主要功能是依据键(Key)来快速查找对应的值(Value)