集合Collection总结

本文深入解析Java集合框架,包括Collection和Map接口的不同实现类及其适用场景。探讨ArrayList、LinkedList、HashSet、TreeSet等集合的特点与使用技巧,并提供选择指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         集合Collection总结

java基础中最重要的东西 —–集合
无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我花了一些时间,查阅了一些资料,总结了一下


一. 集合介绍

1.1为什么需要Collection

  集合类的出现:java是一门面向对象的语言,就免不了处理对象,为了方便操作多个对象,那么我们就得把这多个对象存储起来,想要存储多个对象(变量),很容易就能想到一个容器——-
  常用的容器我们知道有—>StringBuffered,数组,但是由于数组的长度固定;访问方式单一,只能用下标;删除数据,数据不连续,需要往前移动数据;插入数据,数据要向后移动,这些缺点,
  所以,java就为我们提供了集合(Collection).

1.2 数据和集合的区别

区别:
 1.长度的区别
  数组的长度固定;集合的长度可变。
  2.内容的区别
  数组存储的是同一种类型的元素
  集合可以存储不同类型的元素(一般我们不这样做)
  3.元素的数据类型
  数组可以存储基本数据类型,和引用类型
  集合只能存储引用类型(若是简单的int,它会自动装箱成Integer)

1.3Collection的由来与功能

Collection的由来:
  集合可以存储多个元素,但是我们对多个元素也有不同的需求  
- 多个元素,不能有相同的
- 多个元素,能够按照某个规则排序
针对不同的需求:java就提供了很多集合类,多个集合类的数据机构不同,但是,数据结构不重要,重要的是能够存储东西,能够判断,获取,把集合共性的内容不断往上提取,最终形成集合的继承体系—-
———Collection

集合(4接口,9类),Iterator,增强for,可变参数,集合工具类

Colletcion的大致结构体系是:

这里写图片描述

-1.3.1 Collection接口

  Collection是最基本的集合接口,一个Collection代表一Object,即Collection的元素(Elements),java sdk不提供直接继承自Collection的类,java SDK提供的类都是继承自Collection的“子接口”如List和Set
 1.) Collection的基础功能:
  这里写图片描述
  


  • Collection:单列集合的顶层接口,定义了单列集合的共性内容

package java.util;

public interface Collection<E> extends Iterable<E> {
    // Query Operations
    //查询的一些方法

    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a);

    // Modification Operations
    //修改的一些方法
    boolean add(E e);
    boolean remove(Object o);

    // Bulk Operations
    //一些批量操作的方法
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);
    boolean retainAll(Collection<?> c);
    void clear();

    // Comparison and hashing
    //和hash对比  
    boolean equals(Object o);
    int hashCode();

成员方法: A:添加功能
     boolean add(Object obj):往集合中添加一个元素
     boolean addAll(Collection c):往集合中添加多个元素(即添加一个集合)
      B:删除功能
     void clear():清空所有元素
    boolean remove(Object o):从集合中删除一个元素
     boolean removeAll(Collection c):从集合中删除另一个集合的元素
      C:判断功能
     boolean contains(Object o):判断集合中是否包含指定的元素
     boolean containsAll(Collection c):判断集合中是否包含另一个集合的元素
     boolean isEmpty():判断集合是否为空。
     D:交集功能
    boolean retainAll(Collection c) :移除此 collection 中未包含在指定         collection 中的所有元素,如果此 collection 由于调用而发生更改,则返回true。
     E:迭代器(集合特有的遍历方式)
Iterator iterator()
    重点:Iterator的使用
    A:使用步骤
    B:迭代器原理
     F:长度功能
      int size():返回集合中元素的个数
练习题:数组有length()吗?字符串有length()吗?集合有length()吗?
答:数组里面是length属性;字符串里面是length()方法;集合里面是size()方法
    G:集合转数组 
  我们可以发现Collection的源码中继承了Iterable,有iterator()这个方法…
  如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代器对象:如下
  迭代器使用步骤:  

Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}

遍历集合的方法:
(1)将集合转成数组,遍历数组(不常用)
(2)迭代器遍历(创建迭代器对象,用while循环调用hasnext()方法判断下一个元素是否存在,然后调用迭代器的next()方法)
(3)用foreach直接进行遍历
格式:for(数据类型 变量名:要遍历的集合名){
直接输出变量;
}


1.5 数据存储结构总结

一)Collection接口:存储单列数据:
(1)List:单列有序集合(可以重复):
A、ArrayList:底层结构是数组,底层查询快,增删慢(非线程安全,效率高);
B、LinkedList:底层结构是链表型的,增删快,查询慢(线程不安全,效率高);
C、vector:底层结构是数组,线程安全的,增删慢,查询快(不常用);
(2)Set:单列无序集合(唯一):
A、HashSet:底层结构是哈希表
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
按照哈希算法来存取集合中的元素,存取速度比较快;
B LinkedHashSet
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。
C、TreeSet:基于红黑树数据结构,实现元素的“自然排序”;
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
二)Map接口:存储键、值的双列数据集合:
a Map集合的数据结构仅仅针对键有效,与值无关。
b 存储的是键值对形式的元素,键唯一,值可重复。

A HashMap
底层数据结构是数组和链表。线程不安全,效率高
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可
B、LinkedHashMap:
底层数据结构由链表和哈希表组成。
由链表保证元素有序。
由哈希表保证元素唯一。

C、TreeMap:
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性呢?
根据比较的返回值是否是0来决定
如何保证元素的排序呢?
两种方式
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象

D、HashTable:
底层数据结构是哈希表。线程安全,效率低
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),看其返回值
是true:说明元素重复,不添加
是false:就直接添加到集合
否:就直接添加到集合
最终:
自动生成hashCode()和equals()即可 

这里写图片描述
  

1.6 我们怎么选择集合类型?

是否是键值对象形式:
是:Map
键是否需要排序:
是:TreeMap
否:HashMap
不知道,就使用HashMap。
   否:Collection
元素是否唯一:
是:Set
元素是否需要排序:
是:TreeSet
否:HashSet
不知道,就使用HashSet 
否:List
要安全吗:
是:Vector(其实我们也不用它,后面我们讲解了多线程以后,我在给你回顾用谁)
否:ArrayList或者LinkedList
增删多:LinkedList
查询多:ArrayList
不知道,就使用ArrayList
不知道,就使用ArrayList

1.7 集合的常见方法及遍历方式

Collection常见的方法:add() , remove(), contains() , iterator() size()
遍历方式:增强for ,迭代器,
list集合的遍历:3种-1)for循环 2)迭代器 3)增强for循环
set集合的遍历(元素默认是无序的):2种-1)迭代器 3)增强for循环
map集合的遍历:4种
Map接口没有继承Iterator ,所以不能直接使用迭代器
(1)keySet() //取出所有的键,放入一个Set类型集合
(2)keyvules() //取出所有的值,放入一个Collection集合
(3)entrySet() //取出所有的Entry对象,放入一个Set类型集合
//可以对一组键迭代遍历
//对一组值迭代遍历
//对一组Entry对象迭代遍历
注意:用迭代器遍历时不能删除元素
(4)

### STM32CubeMX FreeRTOS CAN Queue Read Example #### 配置项目环境 为了实现基于FreeRTOS的CAN消息队列读取,在STM32CubeMX环境中需完成以下设置: - 使用STM32CubeMX创建新工程并选择目标MCU型号。 - 启用CAN外设支持,并通过RTE(Run-Time Environment)配置其参数,如波特率等。 - 添加对FreeRTOS的支持,这会自动引入必要的库文件和初始化代码。 #### 初始化FreeRTOS与CAN模块 确保已正确设置了`FreeRTOSConfig.h`中的各项参数以适应应用需求[^1]。对于CAN通信部分,则要依据具体硬件平台调整相应的初始化函数调用,通常位于`main.c`或其他由开发者指定的位置。 ```c // main.c or other designated file #include "cmsis_os.h" #include "can.h" osThreadId canReceiveTaskHandle; osMessageQueueId canMsgQueue; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_CAN1_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_CAN1_Init(); osKernelInitialize(); // Initialize CMSIS-OS V2 RTX Kernel // Create the message queue capable of holding up to 10 messages. canMsgQueue = osMessageQueueNew(10, sizeof(CAN_RxHeaderTypeDef), NULL); // Start thread as specified. canReceiveTaskHandle = osThreadNew(can_receive_task, NULL, NULL); osKernelStart(); } ``` #### 创建接收任务处理程序 定义一个专门的任务用于监听来自CAN总线的数据包并通过预先建立的消息队列传递给其他组件进一步解析或响应。 ```c #define MSG_QUEUE_TIMEOUT (10) void can_receive_task(void *argument) { uint8_t rxData[8]; CAN_RxHeaderTypeDef RxHeader; while (true) { if(HAL_CAN_GetRxMessage(&hcan1,&RxHeader,rxData)==HAL_OK){ // Put received data into a queue for processing by another task. osMessageQueuePut(canMsgQueue, &RxHeader, 0, MSG_QUEUE_TIMEOUT); /* Process Data Here */ } osDelay(1); // Short delay between checks } } ``` 上述代码片段展示了如何利用FreeRTOS提供的APIs构建一个多线程应用程序框架下的CAN报文接收机制。每当接收到新的数据帧时即刻将其存入共享资源——消息队列之中等待后续操作;与此同时保持较低优先级循环执行以便让渡CPU时间片给更高紧迫性的作业单元[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值