Java中的集合框架

2023-11-03

一、 概述
1.集合,数组都是对多个数据进行存储操作的结构,简称java容器
说明:此时的存储,只要指的是内存层面的存储,不涉及到持久化的存储(.txtjpg,.avi,数据)
2.数组在存储多个数据方面的特点
一旦初始化以后,其长度就确定了
数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了
比如:String[]arr,int[]arr1,Object[]arrw
3.数组在存储多个数组方面的缺点
一旦初始化以后,其长度就不可修改
数组中提供的方法非常有限,对于添加,删除,插入数据等操作,非常不便,同时效率不高
获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
数组存储数据的特点:有序,可重复。对于无序,不可重复的需求,不能满足
4.集合框架体系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ArrayList的源码分析
在这里插入图片描述
结论:建议开发中使用带参的构造器:ArrayList list=new ArrayList(int capacity)
Jdk8中ArrayList的变化在这里插入图片描述
LinkedList的源码分析
在这里插入图片描述

Veator的源码分析:jdk7和jdk8通过Vector()构造器创建对象时,底层都创建了长度为10的数组
在扩容方面,默认扩容为原来的数组长度的2倍
ArrayList,LinkedList,Vector三者的异同?
同:三各类都是实现了List接口,存储数据的特点相同:存储有序的,可重复的数据
不同:底层源码实现方式不同
ArrayList和LinkedList的异同
二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList比较占优势,因为LinledList要移动指针。对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
ArrayList和Vector的区别
Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类,因为开销就比ArrayList要大,访问要慢。正常情况下,大多数的java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。
List中的方法
Viod add(int index,Object ele):在undex位置插入ele元素
Boolean addAll(int index, Collection eles):从index位置开始将eles中的所有被元素添加进来
IntindexOf(Object obj):返回obj在集合中首次出现的位置
intLastIndexOf(Object obj):返回obj在集合中末次出现的位置
Object remlove(int index):移除指定index位置元素,并返回此元素
Object set(int index,Object ele):设置指定index位置的元素ele
=List subList(int fromindex,int tonIndex):返回从fromIndex到toIndex()位置的子集合=
总结常用方法:
增:add(Object obj)
删:remove(int index)/remove(Object obj)
改:set(int index,Object ele)
查:get(int index)
插:add(int index,Object ele)
长度:size()
遍历:①Iterator迭代器方式②增强for循环③普通for循环
二、 Set接口框架
体系
在这里插入图片描述

Set:存储无序的,不可重复的数据
以HashSet为例说明
无序性:不等于随机性。存储的数据在底层数字中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的
不可重复性:保证添加的元素按照equals()判断时,不能返回ture。即:相同的元素只能添加一个
添加元素过程:以HashSet为例
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:
如果此位置上没有其他元素,则元素a添加成功–>情1
如果此位置上有其他元素b(或者链表的形式存在的多个元素),则比较元素a与元素b的hash值:
如果hash值不相同,则元素a添加成功—>情况2
如果hash值相同,则需要调用元素所在类的equals()方法
equals()返回true,元素a添加失败
equals()返回false,则元素a添加成功
LinkedHashSet的使用
LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据
优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet
TreeSet的使用
向TreeSet中添加的数据,要求时相同的对象
两种排序方式:自然排序(实现Comparable接口)和制定排序(Comparator)
自然排序中,比较两个对象是否相同的标准为compareTo()返回0,不再是equals()
定制排序中,比较两个对象是否相同的标准为compaew()返回0,不再是equals()
三、Map接口

  1. 在这里插入图片描述

2.Map结构的理解
=Map中的kye:无序的,不可重复的,使用Set存储所有的key—>key所在的类要重写equals()和hashCode(以HashMap为例)=
=Map中的value:无序的,可重复的,使用Collection存储所有的value—>value所在类要重写equals()=
一个键值对:key-value构成了一个Entery对象
Map中的entry:无序的,不可重复的,使用Set存储所有的entry
3.HashMap的底层实现原理
在这里插入图片描述
4.LinkedHashMap的底层原理(了解)
在这里插入图片描述
5.Map的常用方法
添加,删除,修改操作
Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
void putAll(Map m):将m中的所有key-value对存放到当前map中
Object remove(Object key):移除指定key-value对,并且返回value
void clear():清空当前map中的所有数据
查询操作
Object get(Object key):获取指定key对应的value
boolean containsKey(Object key):是否包含指定的key
boolean containsKey(Object value):是否包含指定的value
int size():返回map中key-value对的个数
boolean isEmpty():判断当前map和参数对象obj是否相等、
元视图操作方法
Set keyset():返回所有key构成的Set集合
在这里插入图片描述
Collection values():返回所有value构成的Collection集合
Set entrySet():返回所有key-vlue对构成的Set集合
在这里插入图片描述
总结常用方法
添加:put(Object key,Object value)
删除:remove(Object key)
修改:put(Object key,Object value)
查询:get(Object key)
长度:size()
遍历:keyset()/values()/entrySet()
6.TreeMap中添加key-value,要求key必须是由同一个类创建的对象
因为要按照key进行排序:自然排序,定制排序
7.Properties:常用来处理配置文件:key和value都是String类型
在这里插入图片描述
四、Collections集合工具类
常用方法
reverse(List):反转List中元素的顺序
shuffle(List):对List集合元素进行随机排序
sort(List):根据元素的自然顺序对指定List集合元素按升序排序
sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
swap(List,int,int):将指定List集合中i处元素和j处元素进行交换
Object max(Collection):根据元素的自然排序,返回给定集合中最大元素
Object max(Collection,Comparator):根据Comparator指定顺序,返回给定集合中最大元素
Object min(Collectton)
Object min(Collecton,Comparator)
int faequency(Collection,Object)返回指定集合中指定元素的出现次数
void copy(List dest,List src):将src中的内容复制到dest中
boolean replacecAll(List list,Object oldVal,Object newVal):使用新增值替换List对象的所有旧值
同步机制
Collection类中提供了多个synchronizedXxx()方法,该方法可使将指定集
合包装线程同步的集合,从而可以解决多线程并发访问集合时的线程安全

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

Java中的集合框架 的相关文章

随机推荐

  • iOS开发入门教程

    当涉及到详细的教程和排版要求时 纯文本形式的回答无法满足您的需求 以下是一个简单的iOS开发入门教程大纲 您可以按照该大纲进行深入学习和实践 iOS开发入门教程大纲 1 开发环境搭建 下载和安装Xcode 配置iOS模拟器 2 Swift语
  • Echarts

    目录 1 1 什么是ECharts 1 2 ECharts基本使用 1 3 ECharts标题组件 1 4 ECharts工具箱组件 1 5 ECharts弹窗组件 1 6 ECharts饼状图 1 7 ECharts航线图 更详细的教程请
  • spice协议详解(二):spice支持功能和优势

    SPICE Simple Protocol for Independent Computing Environments 是目前最有潜力的开源虚拟桌面协议 最初是由Qumranet开发 后来被RedHat收购并开源 经过几年的社区开发 sp
  • 爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • [大话IT]圈套玄机—《圈子圈套》中的案例分析

    2006 02 22 00 20 14 Filter pattern 楼主 supernal pig 地址 http www12 tianya cn new Publicforum Content asp idWriter 2974942
  • 【拒绝主观!】C++继承中父类的构造函数和析构函数调用情况

    C 继承中父类的构造函数和析构函数调用情况 父类构造函数调用规则 子类会默认调用父类的无参构造函数 且发生在子类所有代码执行之前 原因 父类里面的一些成员可能被设置为private 导致该成员变量只能由父类自己初始化 如果父类不存在无参构造
  • java求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+2....(java50道经典编程题)

    题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加有键盘控制 对于这个题目来说还是比较简单的不过我在编码过程中好像漏了点东西 调试了几遍才好 这
  • React路由懒加载的方式之一

    第一步 在组件中引入 lazy Suspense这两个api import React Component lazy Suspense from react 导入我们的路由组件 示例 import Home from Home import
  • vue-router路由中对query中的参数进行加密

    vue router路由中对query中的参数进行加密 源码地址在文末 在创建路由的时候 添加两个方法 stringifyQuery 序列化传入的query参数 方法可以接收一个对象参数 在new Router的时候传递这个属性 在序列化q
  • HDU寝室断电快乐上网指南(基于树莓派3B+的软路由

    HDU寝室断电快乐上网指南 基于树莓派3B 的软路由 前言 准备工作 1 PPPOE拨号上网 2 解除禁用网卡 3 安装一些其它必要程序 3 1 hostapd 3 2 dnsmasq 4 WIFI热点配置 4 1 解除禁用hostapd
  • MySQL的子查询

    文章目录 什么是子查询 单行子查询和多行子查询 单行子查询 多行子查询 什么是子查询 子查询 是指一个查询语句嵌套在另一个查询语句内的查询 因此也称为 嵌套查询 比如 要查询谁的工资比Abel高 谁的工资比Abel高 方式1 两次查询 SE
  • UnityWebGL 设置启动后自动网页全屏2020.3.40f1版本

    Unity版本2020 3 40f1 这是原版 开始修改 1 打开html修改此处代码 数字改为auto 风格改为100 可直接粘贴代码如下 div style width 100 height 100 div
  • 【HttpRunnerManager】搭建接口自动化测试平台操作流程

    一 需要准备的知识点 1 linux 安装 python3 nginx 安装和配置 mysql 安装和配置 2 python django 配置 uwsgi 配置 二 我搭建的环境 1 Centos7 配置 rabbitmq mysql S
  • 解读Logistic回归模型

    一 logistic回归的由来 logistic回归在百度百科是这样定义的 logistic回归又称logistic回归分析 是一种广义的线性回归分析模型 常用于数据挖掘 疾病自动诊断 经济预测等领域 由此可见 logistic回归是从线性
  • C++:栈(stack)的模板类实现

    1 基本概念 栈中的元素遵守 先进后出 的原则 LIFO Last In First Out 只能在栈顶进行插入和删除操作 压栈 或推入 进栈 即push 将数据放入栈顶并将栈顶指针加一 出栈 或弹出 即pop 将数据从栈顶删除并将栈顶指针
  • intellij idea调试小技巧: 循环调试

    public static void main String args throws InterruptedException int sign 0 for int i 0 i lt 100 i sign i System out prin
  • GPIO子系统-中断子系统

  • 计算机应用与音乐论文,计算机应用论文的专辑

    计算机应用文如何写 下面是小编整理的一些关于计算机应用论文的范文 欢迎阅读 希望对你有帮助 微课运用下中职计算机应用的教学方法 摘要 微课在教育领域中的应用 可以被视为科学技术快速发展与教学水平不断优化的外在表现形式 在中职计算机应用基础教
  • 清理MSConfig系统设置下的启动项

    我使用的系统是windows server 2008 r2 最近发现msconfig很多以前禁用的启动项 太多想删除一下 第一下想到的就是使用xp下的msconfig cleanup 没想到在这个系统上也不能用了 system repair
  • Java中的集合框架

    一 概述 1 集合 数组都是对多个数据进行存储操作的结构 简称java容器 说明 此时的存储 只要指的是内存层面的存储 不涉及到持久化的存储 txtjpg avi 数据 2 数组在存储多个数据方面的特点 一旦初始化以后 其长度就确定了 数组