OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍

2023-05-16

(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)

刘鑫
 

容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法。在 ArkUI 开发框架中,容器类采用了类似静态的语言来实现,并通过 NAPI 框架对外提供。通过对存储位置以及属性的限制,让每种类型的数据都能在完成自身功能的基础上剪除冗余分支,保证了数据的高效访问,提升了应用的性能。

本期,我们将为大家介绍 ArkUI 开发框架中容器类的各种类型以及相关 API 的使用。


一、容器类API介绍


在 ArkUI 开发框架中,提供了线性和非线性两类容器类,共 14 种,每种容器都有自身的特性及使用场景。下面,我们将为大家一一道来。


1.1线性容器类

线性容器类底层主要通过数组实现,包括 ArrayList、Vector、List、LinkedList、Deque、Queue、Stack 七种。线性容器类 API,充分考虑了数据访问的速度,实现了运行时(Runtime)通过一条指令就可以完成增删改查等操作。

1.1.1 ArrayList

ArrayList 即动态数组,可用来构造全局的数组对象。ArrayList 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 10,并支持动态扩容,每次扩容大小为原始容量的 1.5 倍。ArrayList 进行增、删、改、查操作的相关 API 如下:

1.1.2 Vector
 

Vector 是指连续存储结构,可用来构造全局的数组对象。Vector 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 10,并支持动态扩容,每次扩容大小为原始容量的2倍。

由于 Vector 扩容速度高于 ArrayList,所以适用于数据添加比较频繁的场景。Vector 在支持操作符访问的基础上,还增加了 get/set 接口,提供更为完善的校验及容错机制,满足用户不同场景下的需求。Vector 进行增、删、改、查操作的相关 API 如下:

1.1.3 List
 

List 可用来构造一个单向链表对象,即只能通过头结点开始访问到尾节点。List 依据泛型定义,在内存中的存储位置可以是不连续的。

可以通过 get/set 等接口对存储的元素进行修改,List 进行增、删、改、查操作的相关 API 如下:

1.1.4 LinkedList
 

LinkedList 可用来构造一个双向链表对象,可以在某一节点向前或者向后遍历 List。LinkedList 依据泛型定义,在内存中的存储位置可以是不连续的。

可以通过 get/set 等接口对存储的元素进行修改,LinkedList 进行增、删、改、查操作的相关 API 如下:

1.1.5 Queue
 

Queue 可用来构造队列对象,存储元素遵循先进先出的规则。Queue 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 8,并支持动态扩容,每次扩容大小为原始容量的 2 倍。Queue 底层采用循环队列实现,入队及出队操作效率都比较高。Queue 进行增、删、改、查操作的相关 API 如下:

1.1.6 Deque
 

Deque 可用来构造双端队列对象,存储元素遵循先进先出的规则,双端队列可以分别从对头或者队尾进行访问。Deque 依据泛型定义,要求存储位置是一片连续的内存空间,其初始容量大小为 8,并支持动态扩容,每次扩容大小为原始容量的 2 倍。Deque 底层采用循环队列实现,入队及出队操作效率都比较高。Deque 进行增、删、改、查操作的相关 API 如下:

1.1.7 Stack
 

Stack 可用来构造栈对象,存储元素遵循后进先出的规则。Stack 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 8,并支持动态扩容,每次扩容大小为原始容量的 1.5 倍。Stack 底层基于数组实现,入栈出栈均从数组的一端操作,Stack 进行增、删、改、查操作的相关 API 如下:

1.2非线性容器类
 

非线性容器类底层通过 hash 或者红黑树实现,包括 HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray 七种。非线性容器类中的 key 及 value 的类型均满足 ECMA 标准。

1.2.1 HashMap

HashMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。HashMap 依据泛型定义,集合中通过 key 的 hash 值确定其存储位置,从而快速找到键值对。HashMap 的初始容量大小为 16,并支持动态扩容,每次扩容大小为原始容量的 2 倍。HashMap 底层基于 HashTable 实现,冲突策略采用链地址法。HashMap 进行增、删、改、查操作的相关 API 如下:

1.2.2 HashSet
 

HashSet 可用来存储一系列值的集合,存储元素中 value 是唯一的。依据泛型定义。集合中通过 value 的 hash 值确定其存储位置,从而快速找到该值。HashSet 初始容量大小为 16,支持动态扩容,每次扩容大小为原始容量的 2 倍。value 的类型满足 ECMA 标准中要求的类型。HashSet 底层基于 HashTable 实现,冲突策略采用链地址法。HashSet 进行增、删、改、查操作的相关 API 如下:


1.2.3 TreeMap

TreeMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。TreeMap 依据泛型定义,集合中的 key 值是有序的,TreeMap 的底层是一棵二叉树,可以通过树的二叉查找快速地找到键值对。key 的类型满足 ECMA 标准中要求的类型。TreeMap 中的键值是有序存储的。TreeMap 底层基于红黑树实现,可以进行快速地插入和删除。TreeMap 进行增、删、改、查操作的相关 API 如下:


1.2.4 TreeSet

TreeSet 可用来存储一系列值的集合,存储元素中 value 是唯一的。TreeSet 依据泛型定义,集合中的 value 值是有序的,TreeSet 的底层是一棵二叉树,可以通过树的二叉查找快速地找到该 value 值,value 的类型满足 ECMA 标准中要求的类型。TreeSet 中的值是有序存储的。TreeSet 底层基于红黑树实现,可以进行快速地插入和删除。TreeSet 进行增、删、改、查操作的相关 API 如下:


1.2.5 LightWeightMap

LigthWeightMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。LigthWeightMap 依据泛型定义,采用更加轻量级的结构,集合中的 key 值的查找依赖于 hash 值以及二分查找算法,通过一个数组存储 hash 值,然后映射到其他数组中的 key 值以及 value 值,key 的类型满足 ECMA 标准中要求的类型。

初始默认容量大小为 8,每次扩容大小为原始容量的 2 倍。LigthWeightMap 底层标识唯一 key 通过 hash 实现,其冲突策略为线性探测法,查找策略基于二分查找法。LigthWeightMap 进行增、删、改、查操作的相关 API 如下:


1.2.6 LightWeightSet

LigthWeightSet 可用来存储一系列值的集合,存储元素中 value 是唯一的。LigthWeightSet 依据泛型定义,采用更加轻量级的结构,初始默认容量大小为 8,每次扩容大小为原始容量的 2 倍。集合中的 value 值的查找依赖于 hash 以及二分查找算法,通过一个数组存储 hash 值,然后映射到其他数组中的 value 值,value 的类型满足 ECMA 标准中要求的类型。

LigthWeightSet 底层标识唯一 value 基于 hash 实现,其冲突策略为线性探测法,查找策略基于二分查找法。LigthWeightSet 进行增、删、改、查操作的相关 API 如下:


1.2.7 PlainArray

PlainArray 可用来存储具有关联关系的键值对集合,存储元素中 key 是唯一的,并且对于 PlainArray 来说,其 key 的类型为 number 类型。每个 key 会对应一个 value 值,类型依据泛型的定义,PlainArray 采用更加轻量级的结构,集合中的 key 值的查找依赖于二分查找算法,然后映射到其他数组中的 value 值。

初始默认容量大小为 16,每次扩容大小为原始容量的 2 倍。PlainArray 的查找策略基于二分查找法。PlainArray 进行增、删、改、查操作的相关 API 如下:


二、容器类的实现


下面我们将以 ArrayList 为例,为大家介绍,容器类的实现。包括容器类的初始化、容器类的接口调用、容器类对象模型的构建以及拦截器处理。


2.1 容器类初始化

在 ArkUI 开发框架中,通过 NAPI 的统一框架对外层提供容器类。下面,我们将以 ArrayList 为例,介绍基于 NAPI 的容器类的加载。如下图所示,是容器类初始化流程,在 NAPI 加载的过程中,会通过 ArkPrivate.Load 接口加载对应的容器类。ArrayList 在引擎中会初始化 Constructor 以及 Prototype 并返回,最后应用侧可以获得该容器类并使用。


2.2 容器类接口调用

在 ArkUI 开发框架中,容器类 API 的调用流程如下,用户先通过 new ArrayList 进入引擎得到对应的 arraylist 对象,然后可以通过 add 接口向对象中添加元素,元素最终会添加到一片和该 arraylist 绑定的内存空间。可以通过 [] 操作符进行元素获取,对于容器类而言,引擎会直接通过快速路径访问到元素存储位置,返回该值。


2.3 容器类对象模型

在 ArkUI 开发框架中,构造容器类对象模型的流程如下图所示,在运行时禁止再向对象上添加 Properties 属性,ArrayList 借用对象模型中的 elements 位置存储元素。


实现说明:通过 elements 存储数组元素,Length 为数组中元素个数,数组 Capatity 可以通过 elements 的长度获取。

扩容策略:ArrayList –> 1.5 倍

初始分配容量:ArrayList -> 10

  (注:TS 中的实现,扩容策略及初始分配容量不感知)

2.4 拦截器处理

拦截器处理,是指通过禁止掉一些影响对象行为的操作,比如 delete、setPrototype 等,在运行时(Runtime)维护一个高效的容器类对象。以 ArrayList 为例,ArkCompiler 内部拦截的操作主要涉及 DeleteProperty、DefineProperty、GetProperty、SetPrototype、GetOwnPropertyKeys、HasProperty 等操作限制数组的 holy 添加,以及更改属性的 attributes 等操作,保证了不需要做 JSArray 必须做的 holy 判断、writable 判断等操作。


三、容器类API的使用


通过上文的介绍,相信大家对容器类已经有了比较深刻的认识。那么,我们怎么使用容器类 API 呢?本文列举常用的典型容器的使用示例,包括导入模块、增加元素、访问元素及修改等操作:

// ArrayList
import ArrayList from '@ohos.util.ArrayList' // 导入ArrayList模块
let arrayList = new ArrayList();
arrayList.add("a");
arrayList.add(1);    // 增加元素
print(arrayList[0]); // 访问元素
arrayList[0] = one"; // 修改元素
print(arrayList[0]);

// Vector
import Vector from '@ohos.util.Vector'  // 导入Vector模块
let vector = new Vector();
vector.add("a");
let b = [1, 2, 3];
vector.add(b);
vector.add(false); // 增加元素
print(vector[0]);  // 访问元素
print(vector.getFirstElement()); // 访问元素

// Deque
import Deque from '@ohos.util.Deque'  // 导入Deque模块
let deque = new Deque;
deque.insertFront("a");
deque.insertFront(1); // 增加元素
print(deque[0]);      // 访问元素
deque[0] = "one";     // 修改元素
print(deque[0]);

// Stack
import Stack from '@ohos.util.Stack'  // 导入Stack模块  
let stack = new Stack();
stack.push("a");
stack.push(1);   // 增加元素
print(stack[0]); // 访问元素
stack.pop();     // 弹出元素
print(stack.length);

// List
import List from '@ohos.util.List'  // 导入List模块
let list = new List;
list.add("a");
list.add(1);
let b = [1, 2, 3];
list.add(b);        // 增加元素
print(list[0]);     // 访问元素
print(list.get(0)); // 访问元素

// HashMap
import HashMap from '@ohos.util.HashMap'   // 导入HashMap模块
let hashMap = new HashMap();
hashMap.set("a", 123);
hashMap.set(4, 123);      // 增加元素
print(hashMap.hasKey(4)); // 判断是否含有某元素
print(hashMap.get("a"));  // 访问元素

// TreeMap
import TreeMap from '@ohos.util.TreeMap'   // 导入TreeMap模块
let treeMap = new TreeMap();
treeMap.set("a", 123);
treeMap.set("6", 356);           // 增加元素
print(treeMap.get("a"));         // 访问元素
print(treeMap.getFirstKey("a")); // 访问首元素
print(treeMap.getLastKey("a"));  // 访问尾元素

// LightWeightMap
import LightWeightMap from '@ohos.util.LightWeightMap' // 导入LightWeightMap模块
let lightWeightMap = new LightWeightMap();
lightWeightMap.set("x", 123);
lightWeightMap.set("8", 356);   // 增加元素
print(lightWeightMap.get("a")); // 访问元素
print(lightWeightMap.get("x")); // 访问元素
print(lightWeightMap.getIndexOfKey("8")); // 访问元素

// PlainArray
import PlainArray from '@ohos.util.PlainArray'   // 导入PlainArray模块
let plainArray = new PlainArray();
plainArray.add(1, "sdd");
plainArray.add(2, "sff");      // 增加元素
print(plainArray.get(1));      // 访问元素
print(plainArray.getKeyAt(1)); // 访问元素

至此以上就是本期全部内容,期待广大开发者通过 ArkUI 开发框架的容器类开发出更多高性能的应用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍 的相关文章

  • SSH使用问题:无法免密登录

    一 排查服务器端 1 检查authorized keys文件权限 xff0c 并设置为700 chmod 700 authorized keys 2 检查 etc ssh sshd config文件 sudo vim etc ssh ssh
  • PX4项目学习::(一)项目架构

    目录 序 xff1a 项目整体嵌入式架构 xff1a 无人机方面做嵌入式编写的飞控总结 1软件 xff1a 2硬件 xff1a 1 PX4 Pixhawk的软件体系结构 2 下图所示为PX4的算法顶层架构 左边是整个飞控系统的控制功能实现
  • PX4项目学习::(七)飞控栈:导航(Navigator和mission控制)

    25条消息 PX4飞控之导航及任务架构 Felix ZL的博客 CSDN博客
  • 微策略春招面试总结

    春季招聘时我报的研发岗 xff0c 由于我不是杭州本地人 xff0c 故首先接到的是电话面试 xff0c 电话面试大概一周左右被通知去杭州总部面试 下面主要简述一下面试的内容 第一面是技术面 xff0c 大概持续近一个小时 首先面试官会照着
  • PX4项目学习::(六)CMakeLists.txt 文件剖析

    27条消息 PX4 CMakeLists txt 文件剖析 lipi37的博客 CSDN博客 px4 cmake makefile介绍 跟我一起写Makefile 1 0 文档 seisman github io 57条消息 PX4编译文件
  • PX4项目学习::(七)飞控栈算法梳理

    无人机算法分为三种 xff0c 分别为捷联式惯性导航系统 滤波算法和估计算法 xff08 卡尔曼滤波器 xff09 飞行控制算法 xff08 PID算法 xff09 Px4控制算法综述 1commander和navigator产生期望位置
  • PX4项目学习::(七)驱动(src-->drivers)

    PX4的spi驱动 xff0c nuttx的spi硬件抽象 古月居 guyuehome com 无人机中级篇 xff1a 第四讲 xff1a 系统级驱动程序开发 知乎 zhihu com 无人机中级篇 xff1a 第五讲 xff1a 用应级
  • PX4:二次开发:流程

    1 程序编写 xff08 用模板简单实现一个程序 xff09 gt 进阶 xff1a 不同项目下的程序规范 xff1b 调用子模块的流程 2 在Nuttx系统中注册应用并编译 为了使该程序能够编译进固件 xff0c 需要在系统的cmake文
  • 原理::定位与导航::IMU和GPS融合原理(无人驾驶)

    41条消息 动手学无人驾驶 xff08 6 xff09 xff1a 基于IMU和GPS数据融合的自车定位 自动驾驶小学生的博客 CSDN博客 41条消息 重读经典 Quaternion kinematics for the error st
  • 系统使用:vmware虚拟机如何不占用c盘

    42条消息 vmware放在D盘占用C盘空间 vmware虚拟机如何不占用c盘 wendychow001的博客 CSDN博客
  • 无人机学习指南

    学什么 xff1f 理论与开发 理论 xff1a 控制栈的原理与算法 43 通信 目的 xff1a 了解无人机的本质 知识解决的是 why 如果你遇到的问题通常是 xff0c 为什么要用欧拉角 xff1f 为什么要用滤波 xff1f 那说明
  • PX4项目学习::(八)无人机仿真综述(介绍)

    xff08 一 xff09 仿真平台 xff1a 物理化仿真平台 xff1a xff08 world 43 node xff1a 使用基础模块搭建环境 xff08 world environment xff09 与plant xff09 飞
  • PX4项目学习::(一)项目介绍::源码目录介绍

    代码目录 xff1a 1 boards 各种飞控硬件平台的配置文件 2 build 编译产生的目录 xff0c make之后生成的文件放置在这个目录 3 cmake cmake编译配置目录 4 Documentation 开发者文档目录 x
  • PX4项目学习::(三)Nuttx操作系统

    50条消息 PX4代码解析 4 超级菜狗的博客 CSDN博客 px4代码解析
  • Jetson TX2使用记录

    Jetson TX2使用记录 一 配置二 工具1 安装jtop2 安装文件同步工具3 I2C4 ssh5 模块温度 三 自启动1 自启动优化2 自启动设置1 设置WiFi开机自动连接2 设置开机自动登录 用以远程 3 应用软件自启动 3 桌
  • packages.xml分析

    data system packages 1 data system packages list 记录安装app的信息 code com android cts priv ctsshim 10028 0 data user 0 com an
  • PX4项目学习::(四)中间件::通信:uORB

    PX4代码学习系列博客 4 uORB相关 灰信网 xff08 软件开发博客聚合 xff09 freesion com
  • PX4项目学习::(五)项目启动流程(从上电开始)

    PX4的启动流程 初学c语言对RTOS不是很熟悉的同学对main函数都有着不一般的执着 xff0c 阅读代码时总是会去找程序的main函数 xff0c 然后从入口处开始阅读 实际上我们接触的所有软件程序 xff0c 使用到的main函数都不
  • PX4项目学习::(六)项目的配置与编译(Cmake)

    一 简介 在讲解编程之前 xff0c 我得交代两个重要的东西 xff0c 因为这两个东西存在于px4的源码系统当中 xff0c 非常重要 xff0c 它们就是make和Cmake 首先谈谈何为make 熟悉linux系统的朋友对make肯定
  • PX4项目学习::(一)项目架构::软件简明架构

    1 软件构架 PX4软件架构由两个层次组成 xff1a 一是飞行控制栈 flight stack xff0c 即自驾仪的软件解决方案 xff0c 二是中间件 xff0c 一种可以支持任意类型自主机器人的通用机器人中间件 2 1 中间件 中间

随机推荐

  • PX4项目学习::(四)中间件::驱动框架

    驱动框架 PX4的代码库使用一个轻量级的 xff0c 统一的驱动抽象层 xff1a DriverFramework POSIX和 QuRT的驱动写入这个驱动框架当中 旧的NuttX驱动是基于设备 架构的 xff0c 以后将会移植到驱动框架之
  • PX4项目学习::(四)中间件::任务管理与调度

    目录 1 PX4模块运行方式2 PX任务启动方式Task工作队列 参考文献 1 PX4模块运行方式 PX4项目采用两种方式运行 Tasks Work queue tasks Tasks 模块在自己的任务中运行 xff0c 具有自己的堆栈和进
  • PX4项目学习::(五)项目启动流程(纯代码讲解)

    PX4启动流程 xff0c 分为4步 xff1a 1 start xff1a 上电之后程序入口为Firmware NuttX nuttx arch arm src stm32 stm32 start c中的 start函数 xff0c 负责
  • 无人机原理::(一)模型框架与控制系统框架详解

    0 完整框图 1 无人机软件框图 上图为PX4固件框架总览 xff0c 蓝色方块是指飞控系统中的各个模块 下面分别介绍各个模块的作用 xff1a Mavlink模块最为常用 xff0c 可以调整为off board模式以配合机载电脑 xff
  • 基础理论知识

    序 xff1a 综述 机器人专业需要学习什么理论知识 robinvista的博客 CSDN博客 零 基础中的基础 数学 力学 运动学 一 动力学建模与仿真 1 机器人 机器人学基础 蒋志宏 微信读书 2 无人机 全权的两本书 B站有课 3
  • 面试流程总结

    一 HR简单了解情况 xff08 会来了解一般就没啥多说的 xff0c 就是了解下你的意象 xff0c 除非你自己不想去 xff09 二 技术面 一般分两面 xff0c 有些公司急缺人 xff0c 或者一些小公司及其它情况也有可能 面一次
  • 8款设计师常用漂亮的HTML CSS表格样式

    原来的地址 xff1a http www laozuo org 2040 html 我们在布局网站的时候以前都可能直接用TABLE设计 xff0c 如今都更流行使用CSS设计 xff0c 这样对于网站结构更加友好和轻便 下面老左整理的8款设
  • Apollo车辆控制模块::框架与流程

    self drive car 学习笔记 第11课 xff1a 控制理论 鸿 H的博客 CSDN博客 智能驾驶进阶8 控制 次言的博客 CSDN博客 一 框架图 控制输入 xff1a 主要来源于规划模块以及反馈阶段信息 xff08 如loca
  • rt-thread源码分析篇十五:rt_application_init函数分析

    一 rt application init函数调用 二 函数分析 span class token keyword void span span class token function rt application init span s
  • USB 协议整理 八:STM32官方USB库

    https blog csdn net asher zhou article details 105519209 https blog csdn net zcshoucsdn article details 78936456 本章摘取 ST
  • 常用SDK整合

    databuilding SDK官方地址 xff1a https developer android google cn topic libraries data binding
  • 机会留给有准备的人

    通过这次考试 xff0c 发现自己很多不足 xff0c 关上书完全是空白 xff0c 努力吧 xff0c 还有机会
  • 精致代码(C算法——进制问题10-->16)

    xff08 精致算法 xff09 开发思维 十进制转十六进制 蓝桥练习题 xff1a 十进制转十六进制 资源限制 时间限制 xff1a 1 0s 内存限制 xff1a 512 0MB 问题描述 十六进制数是在程序设计时经常要使用到的一种整数
  • C语言多线程同步 -- 信号量semaphore.h

    多线程读文件使用fopen xff0c 出现BUG xff0c 然后寻找同步方法 xff0c 找到这个 信号量 首先需要用sem init 初始化sem t型变量 xff0c 并设置初始信号量 比如设置为1 每次调用sem wait sem
  • 错误管理记录机制(一)

    当执行configure aprutil时 xff0c 提示 xff1a sed 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 这是因为 configure aprutil bat 文件中使用了 Linux 下的 sed
  • 从零编写一个双目视觉SLAM系统(一):一个滑窗的PnP里程计

    最近在尝试用光流法写一个基本的双目视觉SLAM xff0c 希望通过这个项目把SLAM的各个模块都自己实现一遍 xff0c 以此加深对SLAM各个模块的理解 目前刚完成了一个通过求解相邻帧PnP问题的双目视觉里程计 xff0c 基本有了一个
  • 盘点丨无人机与AI 深度融合及跨域应用

    在密集的竹林里 xff0c 一群无人机自如地穿梭其中 xff0c 像组织有序的鸟群 xff0c 时而灵巧地掠过低矮灌木丛 xff0c 时而交叉飞行变换队形 这不是科幻内容 xff0c 而是浙江大学团队研发的自主导航的集群飞行系统 xff0c
  • 安全即代码:为Go实现lint和gosec | Gopher Daily (2020.08.05) ʕ◔ϖ◔ʔ

    每日一谚 xff1a a little copying is better than a little dependency 有意想学习容器或Kubernets的童鞋可以了解一下我的慕课网实战课 xff1a k8s实战 https codi
  • 终于有人把RISC-V讲明白了

    http m elecfans com article 653167 html
  • OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍

    xff08 以下内容来自开发者分享 xff0c 不代表 OpenHarmony 项目群工作委员会观点 xff09 刘鑫 容器类 xff0c 顾名思义就是存储的类 xff0c 用于存储各种数据类型的元素 xff0c 并具备一系列处理数据元素的