Java中的集合框架

概念与作用

集合概念

现实生活中:很多事物凑在一起

数学中的集合:具有共同属性的事物的总体

java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象

 在编程时,常常需要集中存放多个数据,当然我们可以使用数组来保存多个对象。但数组长度不可变化,一旦初始化数组时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数组就有点无能为力了;而且数组无法保存具有映射关系的数据,如成绩表:语文-79,数学-80,这种数据看上去像两个数组,但这个两个数组元素之间有一定的关联关系。

        为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),java提供集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有集合类都位于java.util包下。

        集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上也是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。     

集合的作用

集合与数组对比

集合框架的体系结构

Java的集合类主要由两个接口派生而出:Collection和Map,

Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

图7.1是Collection接口、子接口及其实现类的继承树。

  图7.1中的粗线圈出的Set和List接口是Collection接口派生出的两个子接口,它们分别代表了无序集合和有序集合,阴影部分HashSet和ArrayList是两个主要的实现类。

 图7.2是Map体系的继承数,所有的Map实现类用于保存具有映射关系的数据(也就是前面介绍的关系数组)

   图7.2中显示了Map接口的众多实现类,这些实现类在功能、用法上存在一定的差异,但它们都有一个功能特征:Map保存的每项数据都是Key-value对,也就是有key和value两个值组成。就像前面介绍的成绩单:语文-79,数学-80,每项成绩都由2个值组成。Map里的key是不可重复的,key用于标识集合里每项数据,如果需要查阅Map中数据时,总是根据Map的key来获取。

 根据图7.1和图7.2中粗线标识的3个接口,我们可以把java的所有集合分成三大类:其中Set集合类似于一个罐子,把一个对象添加到Set集合时,Set集合无法记住这个元素的顺序,所以Set里的元素不能重复(否则系统无法准确识别这个元素);List集合非常像一个数组,它可以记住每次添加元素的顺序,只是List的长度是可变的。Map集合也像一个罐子,只是它里面的每项数据都由两个值组成。

  如果访问List集合中的元素,可以直接根据元素的索引来访问;如果需要访问Map集合中的元素,可以根据每项元素的key来访问其value;如果希望访问Set集合中的元素,则只能根据元素本身来访问(这也是Set集合里元素不允许重复的原因)。

 对于List、Set和Map三种集合,最常用的实现类在图7.1、7.2中以灰色区域覆盖,分别是HashSet、ArrayList和HashMap三个实现类。

Collection接口和List接口简介

List接口是一个有序集合,其元素以线性方法存储,集合中允许存放重复的元素。

List接口及其实现类——ArrayList

ArrayList 类是数组列表类,实现了可变长度的数组,允许对集合中的元素进行快速的访问,但向ArrayList 集合中插入或删除速度较慢。。(需要移动元素)

ArrayList 集合允许所有的元素,包括null。

每一个ArrayList 实例都有一个默认的容量,即存储元素的个数,这个容量可以随着元素的增加而自动变大。

链表类:LinkedList类 

LinkedList 是链表类,采用链表结构保存元素。链表结构的优点是便于向集合中插入和删除元素。

因为在插入或删除元素时,不需要移动任何元素。

List的增删改查的方法

实现功能

创建Course类

真正工程中应将所有的属性私有化,通过get和set方法去访问属性

创建学生类

学生能选课,就有很多课程信息,把他的课程信息存放在set类型的属性courses里

因为Set是一个接口,所以不能直接实例化,通过HashSet这个实现类来进行实例化。

创建一个备选课程类ListTest类

创建List类型的属性courseToselect(用于存放备选课程的List)

添加ListTest构造方法,并初始化courseToselect属性,因为List是一个接口,所以在构造方法中不能直接实例化,而通过它的实现类ArrayList来实例化。

对象存入集合当中的时候都会变成Object类型,取出时需要进行类型转换
如果添加到List中的长度大于他目前的长度,则系统会出现异常,即数组下表越界异常。
List是接口,所以在构造方法中不能直接实例化,而通过ArrayList实例化。

用ArrayList的addall方法时,需要将添加的数据转换为列表类型,用asList方法。Arrays.asList(a) 将a由数据类型转变为列表类型list。
用List的add(Object e)和add(int index,Object e)可以向List中添加单个元素,用addall(Collextion c)和addall(int index,Collextion c)可以添加集合(多个元素)。若在index位置有元素,则此元素及后面的元素向下移动。

用List的add(Object e)和add(int index,Object e)可以想List中添加单个元素,用addall(Collextion c)和addall(int index,Collextion c)可以添加集合(多个元素),

通过get()方法,可以把List中相应的索引位置上的元素给取出来。那么如果想要取得List中每一个元素的值,需要用一个for循环像遍历数组一样遍历List。

创建一个testGet方法,为依次遍历List中的元素,首先我们需要取得List的长度,通过调用List的Size()方法来实现。

1.用for循环配合get()方法遍历集合

  1. 迭代器:获取集合迭代器lt--while(lt.hasNext())循环遍历集合--将lt.Next()强转成集合元素类型并用其接收。注意:迭代器只遍历不存储,必须依赖集合存在。

    Iterator本身也是一个接口,Iterator接口。有一个hasNext方法(参数布尔类型)

foreach循环遍历:for(object obj:集合名)

修改List中的元素

List中有个set方法

set(int index, E element)方法,修改列表中的元素
参数:index - 要替换的元素的索引,element - 要在指定位置存储的元素

返回:以前在指定位置的元素

删除List中的元素

remove(Object e)

remove(int index)

removeAll()

泛型

创建一个TestGeneric类(测试泛型)

添加一个带有泛型的List类型的属性。在构造器中初始化courses属性 

测试循环遍历,用for(Course cr: courses)

是把元素作为Course类型取出来,而不是作为Object类型取出来

泛型集合不仅可以存入泛型类型的对象实例,还可以添加泛型的子类型的对象实例

新建一个继承Course类的ChildCourse类。Course类如果只有含参构造器的话,编译器就不会自动添加隐式的无参构造器。子类中必须调用父类的隐式构造器ChildCourse类就会报错。需要手动的在父类中加一个无参构造器。

在TestGeneric类中添加一个testChild方法

泛型集合可以添加泛型的子类型的对象实例

泛型集合中,不能添加泛型规定的类型及其子类型以外的对象,否则会报错。

泛型应该注意的地方:
1.泛型集合中的限定类型不能使用基本数据类型。必须是引用数据类型。
2.如果非要使用基本数据类型时,必须使用它们的包装类 如:int->Integer

Set

Set接口及其实现类--HashSet

list有序的,Set无序的 ,所以Set没有set()这个给定指定索引位置去修改元素的方法。

案例功能

创建一个SetTest类

将Student类中Set类型的属性修改一下,添加一个Course类型的泛型。

在SetTest类添加一个带有泛型Course的List类型的属性courseToSelect,创建SetTest的构造器,初始化courseToSelect属性

因为课程的ID是一个字符串,是一个对象,用equals方法跟输入的字符串比较是否相等。

set特点:无序,不可重复

无序:循环遍历set时只能用foreach或者迭代器iterator方法,不能用get()方法,因为set是无序的,没有index。遍历输出也是乱序的。

不可重复:如果添加几个相同的元素,则只会保留一个!

散列级:HashSet 类 

HashSet类是按照哈希算法来存取集合中的元素的,使用哈希算法可以提高存取的效率。当向HashSet 集合中添加元素时,就会调用该元素的hashCode() 方法,获取哈希码值,然后根据这个哈希码值计算出该元素的存放位置。

HashSet 集合具有以下特点:

  • 不能保证元素的排列顺序,集合中元素的顺序随时有可能发生改变。
  • 集合中最多允许存在一个null元素
  • HashSet 集合不是线程同步的。

Map和HashMap简介

Collection存储的都是单个元素。而Map提供了一种映射的关系(key到value的映射)。

因此,Map集合中保存这两组值,一组用于保存key,另一组用于保存value,key和value都可以是任何引用数据类型。Map集合中的key不允许重复,每一个key只能映射一个value。

Map接口

通过put()方法添加一个键值对的映射

put

V put(K key, V value)

将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当 m.containsKey(k) 返回 true 时,才能说映射 m 包含键 k 的映射关系)。

参数:

key - 与指定值关联的键

value - 与指定键关联的值

返回:

以前与 key 关联的值,如果没有针对 key 的映射关系,则返回 null。(如果该实现支持 null 值,则返回 null 也可能表示此映射以前将 null 与 key 关联)。

Map接口提供三种方法:1.

Set<K>

keySet() 返回此映射中包含的键的 Set 视图。

2.

Collection<V>

values() 返回此映射中包含的值的 Collection 视图。

3.

 Set<Map.Entry<K,V>>

entrySet() 返回此映射中包含的映射关系的 Set 视图。

HashMap类

案例功能

集合工具类:Collections

Collections 类是用于操作List、Set和Map等集合的工具类,该类提供了大量的方法可以对集合元素进行排序、查询和修改等操作。

Collections 类是java.util包下的。它所提供的方法均为静态方法,可以直接通过“类名.方法”的形式调用。小结

  1. 集合的长度是可变的,但是只能存放引用数据类型的数据,不能存放基本数据类型的数据;
  2. Collection 是集合类的基本接口,其主要的子接口有List 和 Set。而Map 不是其子接口。Collection 接口声明所有集合类的核心方法,一般情况下都不会使用Collection 接口,而是使用其子类List和Set集合。
  3. List 是有序的Collection,使用List 接口可以精确地控制每个元素插入的位置,也可以通过索引来访问List集合中的元素。List接口常用的实现类有ArrayList 和LinkedList。List 集合允许存放重复的元素。
  4. Set 是一个不包含重复元素的Collection,Set允许包含null元素,但不能包含重复的元素。一般重写类的equals() 和 hashCode() 方法来区别Set集合中元素是否相同。
  5. Set 接口常用的子类有HashSet 和TreeSet,其中HashSet 是按照哈希算法来存取集合中的元素的,其存取的效率高。HashSet 类是无序存放元素的,而TreeSet 是有序存放元素的,但是需要使用Comparable 进行排序操作。
  6. 集合的输出有多种方式,其中使用Iterator 迭代器是标准的输出方式,在JDK1.5 之后集合也支持了foreach 方式。
  7. Map 没有继承Collection 接口,可以用于保存具有映射关系的数据,其提供的是key 到value的映射。
  8. Map接口常用实现类有HashMap 和TreeMap。HashMap 类是基于哈希表的Map接口的实现,对于元素的添加和删除有着较高的效率。TreeMap 集合主要是对所有的key进行排序,从而保证所有的key-value 映射关系处于有序状态。TreeMap 集合在元素的添加、删除和定位映射性能较低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEE计算Landsat8的NDVI

目录 前言源代码结果 前言 NDVI&#xff08;近红-红&#xff09;/&#xff08;近红红&#xff09; normalizedDifference方法是&#xff08;A-B&#xff09;/&#xff08;AB&#xff09;的计算方法 计算NDVI一般用来配合其他反演参数&#xff0c;构造指数或者数据升降尺度。 …

Java IO学习和总结(超详细)

一、理解 I/O 是输入和输出的简写&#xff0c;指的是数据在计算机内部和外部设备之间的流动。简单来说&#xff0c;当你从键盘输入数据、从鼠标选择操作&#xff0c;或者在屏幕上看到图像&#xff0c;这些都是 I/O 操作。它就像是计算机与外部世界沟通的桥梁&#xff0c;没有 I…

linux项目部署(jdk,tomcat,mysql,nginx,redis)

打开虚拟机&#xff0c;与连接工具连接好&#xff0c;创建一个文件夹 cd /tools 把jdk,tomcat安装包放入这个文件夹里面 jdk安装 #解压 tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 编辑jdk文件以及测试jdk安装 第一行代码路径…

Poi实现根据word模板导出-图表篇

往期系列传送门&#xff1a; Poi实现根据word模板导出-文本段落篇 &#xff08;需要完整代码的直接看最后位置&#xff01;&#xff01;&#xff01;&#xff09; 前言&#xff1a; 补充Word中图表的知识&#xff1a; 每个图表在word中都有一个内置的Excel&#xff0c;用于…

以unity技术开发视角对android权限的讲解

目录 前言 Android权限分类 普通权限 普通权限定义 普通权限有哪些 危险权限 危险权限的定义 危险权限有哪些 动态申请权限实例 申请单个权限实例 第一步&#xff1a;在清单文件中声明权限 第二步&#xff1a;在代码中进行动态申请权限 申请多个权限实例 第一步&am…

大众汽车宣布将ChatGPT,批量集成在多种汽车中!

1月9日&#xff0c;大众汽车在官网宣布&#xff0c;将ChatGPT批量集成到电动、内燃机汽车中。 大众表示&#xff0c;将ChatGPT与其IDA语音助手相结合&#xff0c;用户通过自然语言就能与ChatGPT进行互动&#xff0c;例如&#xff0c;帮我看看最近的三星米其林饭店在哪里&#…

8.1、5G网络切片认识篇

首先&#xff0c;3G上网时代来临&#xff0c;流量高速增长&#xff0c;但是网络资源有限&#xff0c;不可能保证所有业务都能全速进行&#xff0c;总得捡重要的首先保障&#xff0c;因此就对业务进行分类&#xff0c;给予不同优先级的业务不同的资源&#xff0c;不同的服务质量…

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价) 目录 时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 …

基于apache的http文件服务配置

背景&#xff1a; 公司的产品使用的第三方模组可以OTA&#xff0c;厂家提供的是window开启软件&#xff0c;这样就可以在本机做http下载服务器&#xff0c;然后使用端口映射的方式&#xff0c;公开到外网&#xff0c;这样就可以进行4G网络访问内网服务器了。但这个有个弊端&am…

redis 主从同步和故障切换的几个坑

数据不一致 当我们从节点读取一个数据时&#xff0c;和主节点读取的数据不一致&#xff0c;这是因为主从同步的命令是异步进行的&#xff0c;一般情况下是主从同步延迟导致的&#xff0c;为什么会延迟&#xff0c; 主要二个原因 1、网络状态不好 2、网络没问题&#xff0c;从节…

高通平台开发系列讲解(USB篇)Ubuntu 下如何使用模块

文章目录 一、查看VID、PID二、adb添加2.1、在udev下添加模块的VID2.2、重启adb服务三、虚拟串口添加(AT、Diag)沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要图解高通平台上位机使用方法 一、查看VID、PID 在ubuntu下使用模块进行AT指令发送,Diag等串…

【愚公系列】2023年12月 HarmonyOS教学课程 043-Stage模型(ExtensionAbility组件)

&#x1f3c6; 作者简介&#xff0c;愚公搬代码 &#x1f3c6;《头衔》&#xff1a;华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xf…

【Storm实战】1.1 图解Storm的抽象概念

文章目录 0. 前言1. Storm 中的抽象概念1.1 流 (Stream)1.2 拓扑 (Topology)1.3 Spout1.4 Bolt1.5 任务 (Task)1.6 工作者 (Worker) 2. 形象的理解Storm的抽象概念2.1 流 (Stream)2.2 拓扑 (Topology)2.3 Spout2.4 Bolt2.5 任务 (Task)2.6 工作者 (Worker)场景1场景2 3.参考文档…

详解CAS及ABA问题

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是 CAS 问题。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈️✈️动动…

Hex2Bin转换软件、Bootloader 、OTA加密升级 、STM32程序加密、其他MCU同样适用

说明&#xff1a;这个工具可以将 Hex 文件 转换为 Bin 格式文件&#xff0c;软件是按自己开发 STM32 OAT 功能需求开发的一款辅助 上位机软件。 文中的介绍时 bootloader boot 文档在补充完善中... 有兴趣的朋友可留言探讨。 1. 软件功能&#xff1a; 1.生成 bin&#x…

基于模块自定义扩展字段的后端逻辑实现(二)

目录 一&#xff1a;创建表 二&#xff1a;代码逻辑 上一节我们详细讲解了自定义扩展字段的逻辑实现和表的设计&#xff0c;这一节我们以一个具体例子演示下&#xff0c;如何实现一个订单模块的自定义扩展数据。 一&#xff1a;创建表 订单主表: CREATE TABLE t_order ( …

VSCode C/C++(gdb)调试指南

1、安装插件 2、F5开启调试 左侧侧边栏->确保打开回调栈 右键函数栈->查看反汇编 3、打印寄存器、函数反汇编等 命令&#xff1a; 查看main反汇编 -exec disassemble /m main 查看寄存器 -exec info r 打印某个变量 -exec print s 或者 --s 打印寄存器&#xff0c;如p…

如何在没有密码的情况下将 iPhone 13/14/15 恢复出厂设置

您想知道如何在没有密码的情况下将 iPhone 13/14/15 恢复出厂设置吗&#xff1f; 出厂重置 iPhone 13/14/15 成为所有 iPhone 机型中最简单的。大多数情况下&#xff0c;iPhone 13/14/15 是在 iOS 15 或更高版本的 iOS 版本上&#xff0c;Apple 更新了无需密码重置 iPhone 13/…

IoT 物联网 MQTT 协议 5.0 版本新特性

MQTT 是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专门为设备资源有限和低带宽、高延迟的不稳定网络环境的物联网场景应用而设计&#xff0c;可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于智能硬件、智慧城市、智慧农业、智慧医疗、新零…

GAMES101-Assignment5

一、问题总览 在这次作业中&#xff0c;要实现两个部分&#xff1a;光线的生成和光线与三角的相交。本次代码框架的工作流程为&#xff1a; 从main 函数开始。我们定义场景的参数&#xff0c;添加物体&#xff08;球体或三角形&#xff09;到场景中&#xff0c;并设置其材质&…