【java基础】集合基础说明

news2024/11/15 9:16:07

文章目录

  • 基本介绍
  • Collection接口
  • Iterator和Iterable接口
  • Map接口
  • 关于Iterator接口的一些说明
  • 框架中的接口
  • 具体集合
  • 总结

基本介绍

集合就是存储用来存储一系列数据的一种数据结构。在这篇文章中会介绍集合的一些基本概念。

Collection接口

集合的基本接口是Collection接口,基本上所有集合都实现了这个接口。下面来看一下该集合

在这里插入图片描述

该接口定义了许多对集合的操作,通过这些操作,我们就可以很轻松的完成各种数据的增删改查


Iterator和Iterable接口

Iterator是一个接口,有4个方法,其中一个就是next方法,通过这个方法就可以很容易的访问集合中的元素

在这里插入图片描述

通过反复调用next方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next方法将抛出一个NoSuchElementException。因此,需要在调用next之前调用hasNext方法。如果迭代器对象还有多个可以访问的元素,这个方法就返回true。如果想要查看集合中的所有元素,就请求一个迭代器,当hasNext返回true时就反复地调用next方法。例如:

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
            System.out.println(value);
        }
    }

我们可以使用for each完成对集合循环遍历操作

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (Integer value : list) {
            System.out.println(value);
        }
    }

对于实现了Iterable的对象,都可以使用for each循环。集合基本都可以使用for each,因为上面说明了集合类的基本接口是Collection,而Collection又实现了Iterable,所以可以使用,下面就是ArrayList的类图,可以发现最顶层就是Iterable接口

在这里插入图片描述

Iterable即可的内容如下

在这里插入图片描述

Map接口

使用键值对存储数据的集合基本都实现了这个接口,Map接口定义了一些最基本的操作元素的方法,内容如下

在这里插入图片描述


关于Iterator接口的一些说明

我们直接看一下ArrayList里面的Itr类,这个类实现了Iterator接口

	private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        Itr() {}

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        @Override
        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> consumer) {
            Objects.requireNonNull(consumer);
            final int size = ArrayList.this.size;
            int i = cursor;
            if (i >= size) {
                return;
            }
            final Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {
                throw new ConcurrentModificationException();
            }
            while (i != size && modCount == expectedModCount) {
                consumer.accept((E) elementData[i++]);
            }
            // update once at end of iteration to reduce heap write traffic
            cursor = i;
            lastRet = i - 1;
            checkForComodification();
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

根据这个实现类,我们来理解一下这个接口。首先就是定义了2个变量

        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such

通过2个变量来表示索引。
下面就是hasNext,可以发现很简单,就是判断下一个要返回的索引是否等于元素个数

		public boolean hasNext() {
            return cursor != size;
        }

下面就是next方法,忽略抛出异常的各种语句,可以发现就是返回当前cursor指向的值,然后将cursor+1,lastRet就表示为cursor的前一个索引

        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

还有一个是remove方法,这个方法也很容易理解,就是将集合中索引为remove索引位置的元素移除,然后改变cursor的值,也很简单

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }

上面是关于Iterator一直实现的思想,但是是针对数组的,其实对于链表以及其他类型也是类似的。

对于上面的代码,我们也可以看出remove是依赖于next方法的,因为lastRet的值必须由next来进行改变。


框架中的接口

Java集合框架为不同类型的集合定义了大量接口,如图9-4所示。

在这里插入图片描述

可以发现集合有两个基本接口:Collection和Map。Collection存储形式为单个元素,Map就是按照键值对的方式来存储的(K-V)

具体集合

表9-1展示了Java类库中的集合,并简要描述了每个集合类的用途。在表9-1中,除了以Map结尾的类之外,其他类都实现了Collection接口,而以Map结尾的类实现了Map接口。

在这里插入图片描述
在这里插入图片描述

总结

我感觉对于java集合没有什么好说明的,这些内容应该属于数据结构,如果学习过数据结构,那么自己都可以写出这些集合,所以在后面介绍集合的文章中,将不会说明集合的基本概念,只会对源码进行debug,然后说明常用方法。

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

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

相关文章

Metabase和Superset 对比分析

Metabse中文社区Metabase和Superset都是排名靠前的开源的数据可视化软件&#xff0c;在技术上有许多相似之处。他们的比较可以帮助用户选择更好的开源平台进行数据可视化。关于Superset 编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;Super…

Golang反射源码分析

在go的源码包及一些开源组件中&#xff0c;经常可以看到reflect反射包的使用&#xff0c;本文就与大家一起探讨go反射机制的原理、学习其实现源码 首先&#xff0c;了解一下反射的定义&#xff1a; 反射是指计算机程序能够在运行时&#xff0c;能够描述其自身状态或行为、调整…

智慧赋能,聚力开源——第四届OpenI/O 启智开发者大会开源治理专场顺利举办!

为汇聚国内外知名开源组织共同探讨中国开源生态建设及开源治理相关议题&#xff0c;推进产学研用开源合作&#xff0c;2月24日下午&#xff0c;第四届OpenI/O启智开发者大会在深圳人才研修院智汇中心举办以“构建开源联合体&#xff0c;共建开源生态”为主题的开源治理专场分论…

C++基础了解-17-C++日期 时间

C日期 & 时间 一、C日期 & 时间 C 标准库没有提供所谓的日期类型。C 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构&#xff0c;需要在 C 程序中引用 头文件。 有四个与时间相关的类型&#xff1a;clock_t、time_t、size_t 和 …

opencv识别车道线(霍夫线变换)

目录1、前言2、霍夫线变换2.1、霍夫线变换是什么&#xff1f;2.2、在opencv中的基本用法2.2.1、HoughLinesP函数定义2.2.2、用法3、识别车道3.1、优化3.1.1、降噪3.1.2、过滤方向3.1.3、截选区域3.1.4、测试其它图片图片1图片2图片31、前言 最近学习opencv学到了霍夫线变换&am…

ruoyi对接CAS统一身份认证

暂定逻辑如下&#xff1a;搭建CAS服务器端&#xff1a;项目地址&#xff1a;https://gitee.com/weigang_wu/cas-server-webapp.git项目里有二开的说明文档&#xff0c;如&#xff1a;按照自定义的数据库校验修改如下&#xff1a;首先&#xff1a;修改数据库连接以及查询数据这里…

博客系统(前后端分离版)

博客系统的具体实现 文章目录博客系统的具体实现软件开发的基本流程具体实现的八大功能数据库设计创建数据库操作数据库引入依赖封装DataSource创建实体类将JDBC增删改查封装起来实现博客列表页web.xml的配置文件实现博客系统的展示功能登录功能强制要求用户登录显示用户信息退…

求职复盘:干了四年外包出来,面试5次全挂

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…

为什么做知识管理,就想选择Baklib呢?

随着科技的不断发展&#xff0c;知识管理已经成为现代企业不可或缺的一个重要组成部分。由于信息化快速发展&#xff0c;企业每天都会产生大量的数据和信息&#xff0c;如何高效地获取、整理和利用这些信息已经成为了企业成功的关键因素之一。为了更好地管理企业知识&#xff0…

利用Iptables构建虚拟路由器

利用Iptables构建虚拟路由器 &#xff08;1&#xff09;修改网络类型 在VMware Workstation软件中选择“编辑→虚拟网络编辑器”菜单命令&#xff0c;在虚拟网络列表中选中VMnet1&#xff0c;将其配置为“仅主机模式&#xff08;在专用网络内连接虚拟机&#xff09;”&#x…

模板进阶(仿函数,特化等介绍)

非类型模板参数 模板参数有类型形参和非类型形参&#xff1b; 类型形参&#xff1a;使用typename或者class修饰的参数类型名称 非类型形参&#xff1a;一个普通常量作为模板参数形参&#xff0c;不能为浮点数&#xff0c;字符类型以及类对象&#xff1b; #include<iostrea…

虹科新品| HK-TrueNAS企业存储

一、HK-TrueNAS概述HK-TrueNAS 是一种统一存储阵列&#xff0c;提供混合和全闪存配置&#xff0c;以前所未有的价格提供全面的功能集和高达 10.5PB 的容量。TrueNAS 全闪存存储阵列为以闪存为中心的数据中心提供了理想的统一数据存储。每个混合和全闪存 TrueNAS 系统都使用 Tru…

VSCode 开发配置,一文搞定(持续更新中...)

一、快速生成页面骨架 文件 > 首选项 > 配置用户代码片段 选择需要的代码片段或者创建一个新的&#xff0c;这里以 vue.json 举例&#xff1a; 下面为我配置的代码片段&#xff0c;仅供参考&#xff1a; {"Print to console": {"prefix": "…

Mac系统配置java、Android_sdk、gradle、maven、ndk、flutter、tomcat环境变量

搞了三天&#xff0c;终于搞定MAC系统下的各种环境变量了…… 旧版本10.13.6或者更老的MAC系统&#xff0c;只用在.bash_profile文件编辑就行了&#xff1b;新版本10.14.2、10.15.7或者更高的&#xff0c;还要去.zshrc文件加一句source ~/.bash_profile&#xff0c;才能使所有…

java明文数据加密、脱敏方法总结

前言 在一些安全性要求比较高的项目里&#xff0c;避免不了要对敏感信息进行加解密&#xff0c;比如配置文件中的敏感信息。 第一种方法&#xff08;自定义加解密&#xff09; 加解密工具类&#xff1a; public class SecurityTools {public static final String ALGORITHM…

最新!Windows 11 更新将整合 AI 技术

微软MVP实验室研究员张雅琪&#xff08;阿法兔&#xff09;微软最有价值专家&#xff08;MVP&#xff09;&#xff0c;毕业于外交学院和香港大学&#xff0c;IT 技术社区创始人&#xff0c;中关村互联网金融研究院兼职研究员&#xff0c;多次受邀在微软 Reactor 进行公开演讲&a…

JS的BroadcastChannel与MessageChannel

BroadcastChannel与MessageChannel BroadcastChannel BroadcastChannel以广播的形式进行通信 BroadcastChannel用于创建浏览器标签页之间的通信 使用BroadcastChannel的浏览器标签页面必须要遵循同源策略 页面1使用BroadcastChannel创建一个频道&#xff0c;页面2使用Broadc…

latex入门指南:插入图片、表格、公式方法一览

省事链接&#xff1a; 生成表格latex代码&#xff1a;www.tablesgenerator.com 生成公式latex代码&#xff1a;www.latexlive.com 目录1 插入图片1.1 移动标题位置1.2 双栏文章中图片横跨双栏2 插入表格2.1 常规表格2.2 设置单元格宽度2.3 合并单元格2.4 三线表2.5 移动标题位置…

脑机接口科普0018——前额叶切除手术

本文禁止转载&#xff01;&#xff01;&#xff01; 首先说明一下&#xff0c;前额叶切除手术&#xff0c;现在已经不允许做了。 其次&#xff0c;前额叶切除手术&#xff0c;发明这个手术的人居然还获得了诺贝尔奖。太过于讽刺。1949年的那次诺贝尔医学奖&#xff08;就是我…

打怪升级之发送单个UDP包升级版

目标 1.message的输入由edit_control进行&#xff0c;需要捕获输入。 2.用户的主机地址和发送地址不一样&#xff0c;需要分别设置并绑定。 设计RC外观 必备组件&#xff1a;主机IP与端口&#xff0c;从机IP与端口&#xff0c;消息框&#xff0c;发送&#xff0c;连接按钮。…