集合进阶相关基础及底层原理

集合体系结构

单列集合:

Collenction 每次只能添加一个值,其中红色是接口,蓝色是实现类

                                                         图来自黑马程序员网课    

List系列集合:添加的元素是有序,可重复,有索引 

Set系列集合:添加的元素是无序,不重复,无索引 

双列集合:

Map:每次添加一对值

Collection集合

基础方法

        Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的

        图来自黑马程序员网课 

package com.lazyGirl.collectiondemo;import java.util.ArrayList;
import java.util.Collection;public class CollectionDemo1 {public static void main(String[] args) {Collection<String> coll = new ArrayList<String>();//要往List系列添加元素,始终为true//要往Set系列添加元素,如果当前元素不存在,方法返回true//否则返回falsecoll.add("A");System.out.println(coll);coll.clear();System.out.println(coll);coll.add("B");coll.add("C");//若删除的元素不存在,remove返回false//否则返回trueboolean flag = coll.remove("A");System.out.println(flag);//判断元素是否存在底层是使用equals方法进行判断的//若集合存储的是自定义对象,也想通过contains方法判断是否包含,则需重写equals方法boolean res = coll.contains("B");System.out.println(res);System.out.println(coll.isEmpty());coll.add("hhh");int size_coll = coll.size();System.out.println(size_coll);}
}

        输出:

另外一个例子,关于contains()方法 

package com.lazyGirl.collectiondemo;import java.util.ArrayList;
import java.util.Collection;public class CollectionDemo2 {public static void main(String[] args) {Collection<Studnet> coll = new ArrayList<>();Studnet s1 = new Studnet("hh",12);Studnet s2 = new Studnet("hhh",112);Studnet s3 = new Studnet("hhhh",1112);coll.add(s1);coll.add(s2);coll.add(s3);Studnet s4 = new Studnet("hhhh",1112);//因为contains方法在底层依赖于equals方法判断对象是否一致//若存的是自定义对象,没有重写equals方法,则默认使用object类中的equals方法进行判断,// 而object类中的equals方法是根据地址值判断的boolean result = coll.contains(s4);System.out.println(result);}
}

        输出:

         

Collection的遍历方式 

        迭代器遍历:

                 迭代器在Java中的类时Iterator,迭代器是集合专用的遍历方式

                

                        图来自黑马程序员网课 

        

                        图来自黑马程序员

        迭代器在遍历集合的时候是不依赖索引的,通过指针遍历

        

package com.lazyGirl.collectiondemo;import java.sql.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class CollectionDemo3 {public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("A");coll.add("B");coll.add("C");Iterator<String> it = coll.iterator();while (it.hasNext()){System.out.println(it.next());//获取元素并移动指针}
//        System.out.println(it.next());//迭代器遍历完毕不会复位System.out.println(it.hasNext());Iterator<String> it2 = coll.iterator();while (it2.hasNext()){
//            System.out.println(it2.next());
//            System.out.println(it2.next());String s = it2.next();if (s.equals("A")){
//                coll.remove("A");//迭代器遍历时,不能用集合的方法进行增加或者删除,如删除,使用迭代器提供的remove方法进行删除it2.remove();}}}
}

        输出:

         

        底层源码:

        

 原理图:

        图来自黑马程序员网课 

         

        图来自黑马程序员网课 

        增强for遍历:

         增强for的底层就是迭代器,为了简化迭代器的代码书写的。

        在JDK5以后出现的,其内部原理就是一个Iterator迭代器

        所有的单列集合和数组才能用增强for循环遍历

        格式:

                for(元素的数据类型 变量名:数组或者集合){

                }

        //快捷键:集合名.forfor (String str : coll) {System.out.println(str);}
        注意:

        修改增强for中的变量,不会改变集合中原本的数据

        

package com.lazyGirl.collectiondemo;import java.util.ArrayList;
import java.util.Collection;public class EnhancedFor {public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("A");coll.add("B");coll.add("C");//快捷键:集合名.forfor (String str : coll) {str = "111";}System.out.println(coll);}
}

        输出: 

        

        Lambda表达式遍历:

    coll.forEach(s -> System.out.println(s));
package com.lazyGirl.collectiondemo;import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;public class EnhancedFor {public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("A");coll.add("B");coll.add("C");//快捷键:集合名.forfor (String str : coll) {str = "111";}System.out.println(coll);coll.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});coll.forEach(s -> System.out.println(s));}
}

        输出:

         

      总结:

        Collection常见成员方法:add clear remove contains isEmpty size

        三种通用的遍历方式:

                迭代器:在遍历过程中需要删除元素,使用迭代器遍历

                增强for lambda:只遍历

ArrayList集合

List集合的特有方法

  1.   Collection的方法List都继承了
  2.   List集合有索引,所以多了很多索引操作的方法

        

        图来自黑马程序员网课

package com.lazyGirl.listdemo;import java.util.ArrayList;
import java.util.List;public class ListDemo1 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("A");list.add("B");list.add("C");System.out.println(list);//在指定位置上添加元素,后面元素后移list.add(1,"D");System.out.println(list);String a = list.remove(0);System.out.println(a);System.out.println(list);List<Integer> lt1 = new ArrayList<Integer>();lt1.add(1);lt1.add(2);lt1.add(3);//删除元素时,如果出现方法重载,优先调用实参跟形参类型一致的方法lt1.remove(1);System.out.println(lt1);//手动装箱,把基本数据类型的1变为Integer类型Integer i = Integer.valueOf(1);lt1.remove(i);System.out.println(lt1);lt1.add(4);lt1.add(5);//修改指定索引处的元素,返回被修改的元素String res = list.set(0,"R");System.out.println(res);System.out.println(list);System.out.println(list.get(0));}
}

        输出:

         

 List集合的遍历方式

迭代器遍历

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListInterator {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);Iterator<Integer> it = list.iterator();while (it.hasNext()){System.out.println(it.next());}}
}

列表迭代器遍历

package com.lazyGirl.listdemo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class ListInterator {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);ListIterator<Integer> it2 =  list.listIterator();while (it2.hasNext()){int temp = it2.next();if (temp == 2){it2.add(3);}}System.out.println();System.out.println(list);}
}

        输出: 

        

增强for遍历

package com.lazyGirl.listdemo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListInterator {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);for (Integer i : list) {System.out.print(i + " ");}}
}

Lambda表达式遍历

package com.lazyGirl.listdemo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListInterator {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.forEach(i -> System.out.print(i + " "));}
}

普通for循环

      

package com.lazyGirl.listdemo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListInterator {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);for (int i = 0; i < list.size(); i++) {int temp = list.get(i);System.out.print(temp + " ");}}
}

        五种 遍历方式对比:

        迭代器遍历:在遍历过程中需要删除元素

        列表迭代器:在遍历的过程中需要添加元素,

        增强for以及Lambda表达式:仅遍历

        普通for:遍历的时候想操作索引

底层原理

        1. 利用空参创建的集合,在底层创建一个默认长度为0的数组

        2. 添加第一个元素时,底层会创建一个新的长度为10的数组,这个数组的名字叫elementData

        3. 存满时,会扩容1.5倍

        4. 如果一次添加多个元素,1.5倍放不下,则新创建数组的长度以实际为准

        图来自黑马程序员网课 

数据结构概述

        数据结构是计算机底层存储,组织数据的方式,指数据相互之间是以什么方式排列在一起的

数据结构(栈):先进后出(方法运行的时候进栈,执行完出栈)

数据结构(队列):先进先出

数据结构(数组):元素在内存中是连续存储的(删除元素较麻烦)

数据结构(链表):

        链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址,链表查询慢,无论查询哪个数据都要从头开始找

                图来自黑马程序员网课 

LinkedList集合

  1. 底层数据结构是双链表,查询慢,增删快,但是如果操作的是收尾元素,速度也是极快的   
  2.  LinkedList本身多了很多直接操作收尾元素的特有API   

                 

                        图来自黑马程序员网课 

        

LinkedList底层原理 

 

        图来自黑马程序员网课 

 

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

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

相关文章

搜索与图论:深度优先搜索

搜索与图论&#xff1a;深度优先搜索 题目描述参考代码 题目描述 参考代码 #include <iostream>using namespace std;const int N 10;int n; int path[N]; bool st[N];void dfs(int u) {// u n 搜索到最后一层if (u n){for (int i 0; i < n; i) printf("%d …

ICPC2024 邀请赛西安站(7/8/13)

心得 [ICPC2024 Xian I] ICPC2024 邀请赛西安站重现赛 - 比赛详情 - 洛谷 7表示赛时ac了7个&#xff0c;8表示含补题总共ac数&#xff0c;13表示题目总数 题目 M. Chained Lights 打表&#xff0c;发现只有k1是YES //#include <bits/stdc.h> #include<iostream&…

模型评估指标(三)

模型评估指标三 1、模型评估回顾2、综合分类模型评估指标2.1、F1-Score与Fβ-Score2.2、灵敏度与特异度2.3、ROC曲线2.4、AUC曲线3、分类模型评估指标总结4、Sklearn模型评估指标1、模型评估回顾 本文接上篇:模型评估指标(二) 分类模型的评估与回归模型的侧重点不同,回归模型…

【智能算法】大蔗鼠算法(GCRA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;JO Agushaka受到自然界中大蔗鼠在交配季节和非交配季节觅食行为启发&#xff0c;提出了大蔗鼠算法&#xff08;Greater Cane Rat Algorithm, GCRA&#xff09;。 2.算法…

保利威观看页SDK 官方VUE开源项目 polyv-web-live-watch-sdk

一、安装:node、npm 二、下载源码 polyv-web-live-watch-sdk: 保利威直播观看 SDK 官方文档:保利威帮助中心 进入项目根目录 npm ci #安装依赖,如果 CI 失败,请试一下 npm ci --no-cache --registry=https://registry.npmmirror.com/ npm run dev #启动项目 执行完成后…

Qt图标字体文件中提取字体保存为图片

本文借用别人写的一个IconHelper来做说明。 1. 加载一个字体文件 QScopedPointer<IconHelper> iconHelper(new IconHelper(":/fa-regular-400.ttf", "Font Awesome 6 Pro Regular"));构造函数 IconHelper::IconHelper(const QString &fontFile…

【基础】LwM2M 通讯协议

【基础】LwM2M 通讯协议 LwM2M 协议基础LwM2M 简介LwM2M 基本架构LwM2M 资源定义 LwM2M 协议实现开源协议实现Java LwM2M Client LwM2M 协议基础 LwM2M 简介 LwM2M 的全称为 Lightweight Machine-To-Machine&#xff0c;是一种适用于物联网设备的轻量级的通讯协议&#xff0c…

Flutter基础 -- Flutter布局练习(小项目)

目录 1. Splash 布局&#xff08;第一页&#xff09; 1.1 目标 1.2 当前效果图 1.3 创建 Splash 界面 1.4 设置 MaterialApp 1.5 设置 Splash 背景色 1.6 布局 Splash 界面 1.7 总结 2. Splash 圆角图片 2.1 目标 2.2 当前效果图 2.3 蓝湖下载图片 2.4 图片导入项…

在编程Python的时候发生ModuleNotFoundError: No module named distutils报错怎么办

1.先查看Python版本 首先我们先去打开终端就是先widr再输入cmd 然后进去在输入Python -V要注意大小写 我的版本是3.9.7版本但是我使用的PyCharm 是 2021.1.1 x64版本没有办法主动去识别因为这个版太低了你的Python版本很高所以无法识别 2.解决方法 只需要把你的Python现版…

微信公众号【原子与分子模拟】: 熔化温度 + 超导电性 + 电子化合物 + 分子动力学模拟 + 第一性原理计算 + 数据处理程序

往期内容主要涵盖&#xff1a; 熔化温度 超导电性 电子化合物 分子动力学模拟 第一性原理计算 数据处理程序 【1】熔化温度 分子动力学 LAMMPS 相关内容 【文献分享】分子动力学模拟 LAMMPS 熔化温度 晶体缺陷 熔化方法 LAMMPS 文献&#xff1a;金属熔化行为的局域…

vscode ctrl+鼠标左键无法跳转

打开设置&#xff0c;搜索intel…… 将这个智能感知改成default就可以了&#xff0c;我之前是在disable处。 分析了一下&#xff0c;其实跳转功能主要是根据上下文语法分析来实现的&#xff0c;并不是简单得全文匹配&#xff0c;因此需要相关得语法分析工具。 那么为什么默认式…

微软Edge浏览器深度解析:功能、同步、隐私与安全

微软Edge浏览器是微软公司开发的一款网页浏览器,它基于Chromium内核,提供了快速、安全和兼容性良好的网页浏览体验。以下是关于微软Edge浏览器的详细信息和使用指南: 微软Edge浏览器的主要特点: 1. 基于Chromium内核: 渲染引擎:Chromium内核是基于开源项目Blink的,它…

可视化数据科学平台在信贷领域应用系列五:零代码可视化建模

信贷风控模型是金融机构风险管理的核心工具&#xff0c;在信贷风险管理工作中扮演着至关重要的角色。随着信贷市场的环境不断变化&#xff0c;信贷业务的风险日趋复杂化和隐蔽化&#xff0c;开发和应用准确高效的信贷风控模型显得尤为重要。信贷风险控制面临着越来越大的挑战和…

问你为什么选择Kafka,你会怎么回答?

可靠的含义在百度百科的解释是&#xff1a;可以信赖、可以相信、可靠的朋友。那Kafka究竟是不是一个可靠的朋友呢&#xff1f;既然全世界绝大部分高可用系统都有Kafka的支持&#xff0c;Kafka必定有其过人之处&#xff0c;跟着我来分析分析。 另外多提一嘴Kafka在GitHub目前已…

六西格玛培训,带你解锁职场超能力工具!

当提及六西格玛培训的精髓时&#xff0c;我们不得不提到那些强大而实用的工具&#xff0c;它们如同探险者的指南针&#xff0c;引导我们走向卓越。今天&#xff0c;就让我们一起揭开这些神秘工具的面纱&#xff0c;探寻六西格玛背后的智慧。 首先&#xff0c;DMAIC流程是六西格…

cesium 漫游

token记得换成您自己的&#xff01;&#xff01;&#xff01; 申请cesium的token 官网【Cesium: The Platform for 3D Geospatial】 <template><div id"cesiumContatiner"><!-- <div id"mapContainer1"></div> --></di…

员工离职删除自己做的文件违法么?如何杜绝这种现象?

员工离职时删除自己做的文件是否违法&#xff0c;需要视情况而定&#xff1a; 如果删除的是个人自己的文件&#xff1a; 在这种情况下&#xff0c;员工删除的是自己制作的、不涉及公司机密或经营数据的个人文件&#xff0c;通常不会被视为违法行为。 如果删除的是公司的文件…

探索 CSV 模块:Python 中 CSV 数据持久化的最佳实践

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 本章节介绍使用 CSV 文件来存储数据&#xff0c;CSV 文件是一种常见的数据格式&#xff0c;可以用来存储和交换表格数据。CSV 文件由一系列的行组成&#x…

SQL Developer管理RESTful 服务

RESTful 服务依赖于ORDS&#xff08;Oracle REST Data Services&#xff09;&#xff0c;所以在进行本实验前&#xff0c;请先确认数据库服务器上的ORDS服务已启动&#xff1a; $ systemctl status ords ● ords.service - Oracle REST Data ServicesLoaded: loaded (/etc/sys…

23中设计模式之一— — — —命令模式的详细介绍

命令模式 Command Pattern讲解 概念描述模式结构主要角色模式的UIM类图模式优点模式缺点应用场景实例演示类图代码演示运行结果 概念 命令模式&#xff08;别名&#xff1a;动作&#xff0c;事务&#xff09; 命令模式是一种行为设计模式&#xff0c;将一个请求封装为一个对象…