集合框架体系和使用1(Collection)

Map的不同实现类单独再搞一章讲

目录

数组的特点、弊端与集合框架体系介绍

 数组

        特点

        弊端

Java集合框架体系(java.util包下)

java.util.Collection:存储一个一个的数据(主要讲两个子接口)

java.util.Map:存储一对一对的数据(key-value键值对。类似于高中的函数)(没有子接口)

学习的把握(怎么掌握)

Collection接口中的方法的测试

常用方法

向Collection中添加元素的要求:

集合和数组之间的转换

Iterator(迭代器)的作用

代码实现

 增强for循环

作用:

格式:

 说明:

List接口常用方法

特点:

常用方法:

List不同实现类的对比

Set不同实现类的对比及无序性,不可重复性的剖析

区别

方法:

开发中使用频率和场景:

理解无序性和不可重复性

无序性:不是指随机性

不可重复性

添加到HashSet\LinkedHashSet中元素的要求

TreeSet的使用


数组的特点、弊端与集合框架体系介绍

 数组

        特点

  • 一旦初始化,长度就确定了
  • 数组中的多个元素是依次紧密排列的,有序的,可重复的
  • (优点)数组一旦初始化完成,其元素的类型就是确定的,不是此类型的元素,就不能添加到数组中
  • (优点)元素的类型既可以是基本数据类型,也可以是引用数据类型

        弊端

  • 一旦初始化,长度就不可变了
  • 数组中存储数据特点的单一性,对于无序的,不可重复的场景的多个数据就无能为力了
  • 数组中可用的方法和属性都极少。具体需求都需要自己来组组织相关代码逻辑
  • 对于数组中的删除和插入操作性能较差。

Java集合框架体系(java.util包下)

从接口角度下分类

java.util.Collection:存储一个一个的数据(主要讲两个子接口)

  • 子接口:List:存储有序的、可重复的数据(“动态”数组)
    • 实现类:ArrayList(主要的实现类)、LinkedList、Vector(老的)
  • 子接口:Set:存储无序的、不可重复的数据(高中学习的集合)
    • 实现类:HashSet(主要的实现类)、LinkedHashSet、TreeSet

java.util.Map:存储一对一对的数据(key-value键值对。类似于高中的函数)(没有子接口)

        实现类HashMap(主要的实现类)、LinkedHashMap、TreeMap、Hashtable、Properties(Hashtable的子类)

        HashSet底层原理和HashMap一样(value=null).

学习的把握(怎么掌握)

  • ①针对具体特点的多个数据,知道选择相应的适合的接口的主要实现类,会实例化、会调用常用的方法
  • ②区分接口中不同的实现类的区别。
  • ③针对常用的实现类,需要熟悉底层的源码,熟悉常见的数据结构(后面讲)

Collection接口中的方法的测试

常用方法

添加相关add,addAll,contains,containsAll,equals,size,isEmpty

删除相关的clear,remove,removeAll,retainAll

其他toArray,hashCode,iterator

向Collection中添加元素的要求:

  • 要求元素所属的类一定要重写equals()!
  • 原因:Collection中的相关方法(比如:contains/remove),都会涉及到equals的使用

集合和数组之间的转换

  • 集合——>数组:toArray()
  • 数组——>集合:调用Arrays的静态方法asList()

Iterator(迭代器)的作用

作用:用来遍历集合元素的

代码实现

如何使用迭代器

Collection coll = new ArrayList();
//创建迭代器对象
Iterator iterator = coll.iterator();//使用,每使用一次next(),会向下读一次
System.out.println(iterator.next());

所以使用迭代器一般使用循环,所以结合hasNext(),我们有更高级的写法

 增强for循环

作用:

用来遍历数组和集合

格式:
for(要遍历的集合或者数组元素的类型 临时变量名 : 要遍历的集合或数组(容器))
{
操作临时变量的输出
}

 说明:
  • 对于集合来说,增强for循环的底层仍然使用的是迭代器
  • 增强for循环执行过程中,是将集合或数组中的元素依次赋值给临时变量,所以循环体中对临时变量的修改,可能不会导致原有集合或数组元素的修改

List接口常用方法

特点:

有序的,可重复的数据——>替代数组,看作“动态数组”

常用方法:

1.Collection里面的15个方法

2.因为List是有序的,进而就有索引,就会增加一些对索引的操作…………等等

    • add(Object obj)
    • addAll(Collection coll)
    • remove(Object object)
    • remove(int index)
    • set(int index,Object obj)
    • get(int index)
    • add(int index,Object obj)
    • add(int index,Collection coll)
  • 长度
    • size()
  • 遍历
    • iterator()
    • 增强for循环
    • 一般for循环

List不同实现类的对比

  • ArrayList: List的主要实现类,线程不安全的,效率高,底层使用的Object[ ]数组存储。
    • 在添加数据和查找数据时效率高,在插入和删除数据时效率低。
    • 后面还有源码(回来写)
  • LinkedList:底层使用双向链表的方式进行存储,在对集合数据进行频繁的删除和插入操作时,建议使用此类
    • 在添加数据和查找数据时效率低,在插入和删除数据时效率高。
  • Vector:List古老的实现类,线程安全的,效率低,底层使用的Object[ ]数组存储。

Set不同实现类的对比及无序性,不可重复性的剖析

区别

  • HashSet主要实现类,底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储。
    • LinkedHashSet是HashSet的子类,在现有的数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序,即可以按照添加元素的顺序实现遍历。便于频繁的查询操作
  • TreeSet:底层使用红黑树存储。可以按照添加元素的指定的属性的大小的顺序进行遍历

方法:

Set中常用的方法和Collection中的15个一样,没有新增的方法

开发中使用频率和场景:

  • 相较于List、Map来说,Set使用频率较少
  • 用来过滤重复数据的

理解无序性和不可重复性

无序性:不是指随机性

  • 添加元素的顺序和遍历元素的顺序不一致指的不是无序性,
  • 无序性与添加元素的位置有关,不像ArrayList一样是依次紧密排列的。
  • 这里根据添加元素的Hash值计算的其在数组中的存储值。此位置不是依次排列的,表现为无序性

不可重复性

  • 添加到Set中的元素是不能相同的。
  • 比较的标准,需要判断HashCode() 得到的哈希值以及equals()方法得到的boolean型的结果
  • 哈希值相同且equals()返回true,则认为元素是相同的。

添加到HashSet\LinkedHashSet中元素的要求

        要求元素所在的类要重写两个方法:equals()和hashCode()。同时要求这两个方法保持一致性!只需要我们在idea中自动生成两个方法的重写即可。

TreeSet的使用

  • 底层数据结构:红黑树
  • 添加数据后的特点:可以按照添加元素的顺序实现遍历。
  • 要求:
    • 要求添加的元素必须是同一个类型,否则汇报ClassCastException
    • 添加的元素需要考虑排序:①自然排序②定制排序
  • 判断数据是否相同的标准:
    • 不再是考虑hashCode( )/equals()方法了,也就是意味着添加到TreeSet中的元素所在的类不需要重写他们了
    • 比较元素大小的或比较元素是否相等的标准就是考虑自然排序或定制排序中compare()或compareTo()的返回值,如果他们的返回值为0,则认为两个对象是相等的。由于TreeSet中不能存放相同的元素,则后一个相等的元素就不能添加到TreeSet中

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

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

相关文章

基于uniapp大学生社团活动管理系统python+java+node.js+php微信小程序

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 语言:pythonjavanode.jsphp均支持 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 运行软件:idea/eclipse/vscod…

递归和迭代【Py/Java/C++三种语言详解】LeetCode每日一题240218【树DFS】LeetCode 589、 N 叉树的前序遍历

有LeetCode算法/华为OD考试扣扣交流群可加 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目描述解题思路代码方法一:递归法PythonJavaC时空复杂度 方法二:迭代法PythonJavaC时空复杂度 …

面试redis篇-08数据淘汰策略

原理 当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。 Redis支持8种不同策略来选择要删除的key: noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是…

JetBrains系列工具,配置PlantUML绘图

PlantUML是一个很强大的绘图工具,各种图都可以绘制,具体的可以去官网看看,或者百度。 PlantUML简述 https://plantuml.com/zh/ PlantUML语言参考指引 https://plantuml.com/zh/guide PlantUML语言是依赖Graphviz进行解析的。Graphviz是开源…

[设计模式Java实现附plantuml源码~行为型] 撤销功能的实现——备忘录模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

2024程序员容器化上云之旅-第6集-Ubuntu-WSL2-Windows11版:艰难复活

故事梗概 Java程序员马意浓在互联网公司维护老旧电商后台系统。 渴望学习新技术的他在工作中无缘Docker和K8s。 他开始自学Vue3并使用SpringBoot3完成了一个前后端分离的Web应用系统,并打算将其用Docker容器化后用K8s上云。 8 复活重生 周末终于有点属于自己的…

【书籍分享 • 第三期】虚拟化与容器技术

文章目录 一、本书内容二、读者对象三、编辑推荐四、前言4.1 云计算技术的发展4.2 KVM、Docker4.3 本书内容简介4.4 作者简介 五、粉丝福利 一、本书内容 《虚拟化与容器技术》通过深入浅出的方式介绍KVM虚拟化技术与Docker容器技术的概念、原理及实现方法,内容包括…

Linux之安装Nginx、前后端分离项目部署

目录 一、安装Nginx 1.1先一键安装4个依赖 1.2下载并解压安装包 1.3安装nginx,一般我们在nginx都是要安装ssl证书的 1.4 启动nginx服务 1.5开放80端口 1.6配置nginx自启动 1.7修改/etc/rc.d/rc/local的权限 二、多个tomcat负载加后端部署 2.1创建多个tomca…

Windows已经安装了QT 6.3.0,如何再安装一个QT 5.12

要在Windows上安装Qt 5.12,您可以按照以下步骤操作: 下载Qt 5.12:访问Qt官方网站或其他可信赖的来源,下载Qt 5.12的安装包。 下载安装地址 下载安装详细教程 安装问题点 qt安装时“Error during installation process(qt.tools…

react useRef用法

1&#xff0c;保存变量永远不丢失 import React, { useState,useRef } from react export default function App() { const [count,setcount] useState(0) var mycount useRef(0)//保存变量永远不丢失--useRef用的是闭包原理 return( <div> <button onClick{()>…

跨境电商营销进化史:从传统广告到智能化策略的全面探析

随着全球化的不断推进和互联网技术的飞速发展&#xff0c;跨境电商在过去几年里取得了显著的发展。在这个竞争激烈的市场中&#xff0c;企业们纷纷调整营销策略以应对不断变化的消费者需求和市场趋势。本文Nox聚星将和大家探讨跨境电商营销策略的演变过程&#xff0c;从传统的推…

MySQL基础(二)

文章目录 MySQL基础&#xff08;二&#xff09;1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…

Python爬虫中的单线程、多线程问题(文末送书)

前言 在使用爬虫爬取数据的时候&#xff0c;当需要爬取的数据量比较大&#xff0c;且急需很快获取到数据的时候&#xff0c;可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进…

【Flink精讲】Flink反压调优

Flink 网络流控及反压的介绍&#xff1a; Apache Flink学习网 反压的理解 简单来说&#xff0c; Flink 拓扑中每个节点&#xff08;Task&#xff09;间的数据都以阻塞队列的方式传输&#xff0c;下游来不及消费导致队列被占满后&#xff0c;上游的生产也会被阻塞&#xff0c;…

GaussDB SQL调优:选择合适的分布列

一、背景 GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数…

Netty NIO 非阻塞模式

1.概要 1.1 说明 使用非阻塞的模式&#xff0c;就可以用一个现场&#xff0c;处理多个客户端的请求了 1.2 要点 ssc.configureBlocking(false);if(sc!null){ sc.configureBlocking(false); channels.add(sc); }if(len>0){ byteBuffer.flip(); 2.代码 2.1 服务端代码 …

Springboot 多级缓存设计与实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

StarRocks之扩容缩容

扩缩容 FE 集群 StarRocks FE 节点分为 Follower 节点和 Observer 节点。Follower 节点参与选举投票和写入&#xff0c;Observer 节点只用来同步日志&#xff0c;扩展读性能。 注意&#xff1a; 所有 FE 节点的 http_port 必须相同。 Follower FE 节点&#xff08;包括 Leader…

超真诚婚礼邀请函小程序

结婚了&#xff0c;自己写个婚礼邀请函小程序&#xff0c;含泪省下&#xffe5;49.9&#xff1b;程序员的浪漫&#xff01; 1、定位直达 2、背景音乐 3、倒计时 4、CSDN图床 页面代码如下&#xff1a; <cu-custom bgColor"bg-yellow-light" isBack"{{fal…

基于HT32的智能家居demo(蓝牙上位机)

参加合泰杯作品的部分展示&#xff0c;基于HT32的智能家居&#xff0c;这里展示灯光的相关控制&#xff0c;是用蓝牙进行的数据透传&#xff0c;参考了一些资料&#xff0c;美化封装了一下之前的上位机界面。 成果展示 点击主界面的蓝牙设置&#xff0c;进行连接&#xff0c;下…