java -数据结构 - 集合框架及背后的数据结构

news2025/1/19 3:25:07

什么是集合框架

数据结构,我们知道数据结构就是组织数据的一种方式,比如所链表,就是将数据存储在链表的value域中,next域就是存储下一个节点的地址,通过这样的方式将数据组织起来。
在我们学习中,所知道 的 二叉树,栈,队列等这些,在Java中都被封装起来了。
也就是说以后用的时候,在Java中不用我们自己去实现栈,列表,顺序表等操作,直接使用Java中写好的。直接拿过来用就对了。
那么集合框架的集合其实就是Java写好的一些数据结构,所以我们就需要去了解一下每一个集合,它背后的数据结构是么。
最后框架又是什么:顾名思义,就像是有一个大架子,东西分开摆放,具有层次感。
结合来说:集合框架 就是 每一种集合,它都是一定关系和关联的。

一、介绍

官方文档

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util包下的一组 接口 interfaces 和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理 manipulate,即平时我们俗称的增删查改 CRUD 。
例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等

所以我们要使用这些集合框架的时候就要导入这个包 java.util
在这里插入图片描述

1.1、类和接口总览

下面这张图并不是将所有的接口,抽象类,具体的实现类都列举出来,只是将部分重要的列举出来
interface:接口,图中和这个颜色一样的都代表是接口
abstract class :抽象类,图中和这个颜色一样的都代表是抽象类
class:具体的实现类,图中和这个颜色一样的都代表是具体的实现类
在这里插入图片描述

下面我们要了解几个问题:
1、了解清楚,接口和接口之间的关系
2、了解清楚,接口和类之间的关系
3、了解清楚,每个类背后的数据结构大概是个啥?
在这里插入图片描述

三个工具

在这里插入图片描述

二、学习的意义

2.1 Java 集合框架的优点及作用

  • 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
  • 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景

2.2 笔试及面试题

腾讯-Java后台开发面经

  1. HashMap 了解不,介绍一下,如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?
  2. HashSet 和 HashMap 的区别是什么?
  3. HashMap 是线程安全的么?那需要线程安全需要用到什么?

阿里巴巴-Java后台开发面经

  1. ArrayList 和 LinkedList 的区别是什么?
  2. 有了解过 HashMap 的具体实现么?
  3. HashMap 和 ConcurrentHashMap 哪个效率更高?

今日头条-Java后台开发面经

  1. 编程题:判断一个链表是否是一个回文链表。
  2. Redis 的 zset 类型对应到 java 语言中大致是什么类型?
  3. hashCode 主要是用来做什么用的?

三、接口 interfaces

3.1、基本关系说明

  1. Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements

  2. Set : 元素不能重复,背后隐含着查找/搜索的语义

  3. SortedSet : 一组有序的不能重复的元素

  4. List : 线性结构

  5. Queue : 队列

  6. Deque : 双端队列

  7. Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义

  8. SortedMap : 一组有序的键值对
    在这里插入图片描述

3.2、Collection 接口说明

Collection 官方文档

3.3、Collection 常用方法说明

注意:
Collection是一个接口,不是一个类,所以不能的直接就去new。只能去new一个实现collection接口的类
接口是不能实例化的。

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

3.4、Collection代码示例

代码示例1:在集合里面添加元素

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
    }

在这里插入图片描述

代码示例2:将集合中所有元素删除

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        collection.clear();
        System.out.println(collection);
    }

在这里插入图片描述

代码示例3:判断集合中是否有元素,有返回false,没有返回true

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        boolean bool = collection.isEmpty();
        System.out.println(bool);
    }

在这里插入图片描述

代码示例4:如果元素 e 出现在集合中,删除其中一个

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        collection.remove(100);
        System.out.println(collection);
    }

在这里插入图片描述

代码示例5:返回集合中的元素个数

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        int ret = collection.size();
        System.out.println(ret);
    }

在这里插入图片描述

代码示例6:返回一个装有所有集合中元素的数组

public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>();
        collection.add(123);
        collection.add(100);
        collection.add(200);
        System.out.println(collection);
        Object[] str = collection.toArray();
        System.out.println(str);
        System.out.println(Arrays.toString(str));
    }

在这里插入图片描述

不建议将数组整体进行强制类型转换

如果我们将Object类型的数组强制转换成Sting类型的数组就会报错
在这里插入图片描述

但是如果我们将Sting类型的数组强制转换成Object类型的数组就不会报错
在这里插入图片描述

可以去看看在 Java 中创建泛型数组,这上面有详细的的说明

3.5、Map,接口说明

Map官方文档

3.6、Map 常用方法说明

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

代码示例7:将指定的k-v放入Map中

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
    }

在这里插入图片描述

代码示例8:根据指定的 k 查找对应的 v

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.get(2));
    }

在这里插入图片描述

代码示例9:根据指定的 k 查找对应的 v,没有找到用默认值代替

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.getOrDefault(5,"默认值"));
    }

在这里插入图片描述

代码示例10:将指定的 k-v 放入 Map

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        map.put(8,"eeee");
        map.put(4,"asddf");
        System.out.println(map);
    }

在这里插入图片描述

代码示例11:判断是否包含 key

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.containsKey(4));
    }

在这里插入图片描述

代码示例12:判断是否包含 value

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.containsValue("hello"));
    }

在这里插入图片描述

代码示例13:判断是否为空

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.isEmpty());
    }

在这里插入图片描述

代码示例14:返回键值对的数量

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");
        System.out.println(map.size());
    }

在这里插入图片描述

代码示例15:将所有键值对返回

public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"aaa");
        map.put(2,"bbb");
        map.put(3,"ccc");
        System.out.println(map);
        System.out.println("----------");

        Set<Map.Entry<Integer, String>> entrySet = map.entrySet();

        for (Map.Entry<Integer, String> entry: entrySet) {
            System.out.println(entry);
        }
    }

在这里插入图片描述

四、实现 classes

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

接口幂等实现基于注解(适用于分布式系统中支持spEl动态过滤)

在网络卡顿时,容易出现在极短的时间内产生重复请求,或重复支付,一般我们会在数据操作时先通过数据查询是否存在,然后再进行业务逻辑操作的方式来进行避免,但是这种方式并不是原子性,很容易出现第一次请求未进行落表,第二次重复的请求就已经通过了数据库查询,可通过设置唯一索引…

用于开发语音 AI 应用程序的 GPU 加速 SDK

NVIDIA Riva 简介&#xff1a;用于开发语音 AI 应用程序的 GPU 加速 SDK 语音 AI 用于多种应用&#xff0c;包括联络中心的座席助理以增强人类座席的能力、智能虚拟助理 (IVA) 的语音界面以及视频会议中的实时字幕。 为了支持这些功能&#xff0c;语音 AI 技术包括自动语音识别…

基于springboot的社区团购管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

FineReport企业报表工具-JS根据条件显示参数控件

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 问题描述 在使用参数控件时&#xff0c;有时我们希望部分参数控件在没满足条件时不显示&#xff0c;满足条件后再显示&#xff0c;如下图效果&#xff0c;只有前面的下拉框选择了内容之后&#xff0c;后一层下拉框控…

【C语言】重要函数qsort函数的用法

目录 一、qsort函数的介绍 1、整形数组 2、字符数组 3、字符串 4、结构体 二、qsort函数的使用 一、qsort函数的介绍 qsort函数是一种底层快速排序的函数&#xff0c;它的特点就是可以排序任意类型的数据&#xff0c;比如&#xff1a;整形、字符串、浮点型、以及结构体类型。 …

VUE3-组件之间传值《四》

目录 一.父传子&#xff0c;父组件向子组件传值 二.子传父&#xff0c;子组件向父组件传值 三.兄弟组件之间互传&#xff0c;2个组件之间是平级关系&#xff0c;互相传值 组件之间的传值&#xff0c;分为3种方式 一.父传子&#xff0c;父组件向子组件传值 1.建立一个默认的…

零信任深入理解--概念,架构和实现方案

1. 零信任究竟解决了什么问题&#xff1f; 很多人在初步了解“零信任”概念&#xff0c;乃至进一步研究一些技术和产品方案之后&#xff0c;会有种“不过如此”的感觉。 毕竟&#xff0c; IAM&#xff08;Identity and Access Management&#xff0c;身份识别与访问管理&…

6. 【gRPC系列学习】Balance原理详解

本节开始分析Balance执行原理,通过上面流程可知,Balance Build的创建来自于Resolver的解析完成后调用updateResolverState方法,我们从updateResolverState方法开始分析Balance执行流程。 1. Balance调用流程 1)updateResolverState(s resolver.State, err error) error 方…

Java培训MySQL之全局序列

1.本地文件 不推荐&#xff0c;存在宕机序列丢失问题。 2.数据库方式 数据库序列方式原理 利用数据库一个表 来进行计数累加。但是并不是每次生成序列都读写数据库&#xff0c;这样效率太低。 mycat会预加载一部分号段到mycat的内存中&#xff0c;这样大部分读写序列都是在…

第二章:Linux的目录结构-[基础篇]

一&#xff1a;基础介绍 linux的文件系统是采用级层式的数状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录。 深刻理解linux树状文件目录是非常重要的&#xff0c;这里我给大家说明一下。 记住一句经典的话&#xff1a;在Li…

通信原理循环码

目录 码多项式 码多项式的按模运算 循环码的码多项式 循环码的生成矩阵 如何寻求任一循环码循环码的生成多项式​ 码多项式 一个长度为的码组可表示成如下多项式形式&#xff1a; 多项式的系数就是码组中的各码元&#xff0c;仅是码元位置标记 。 n7 时&#xff1a; 例&…

Activiti任务的处理以及进阶使用

1.什么是流程实例 流程实例&#xff08;ProcessInstance&#xff09;代表流程定义的执行实例 一个流程实例包括所有的运行节点Task&#xff0c;所以我们一般使用来了解当前流程的进度信息 taskService.createTaskQuery().processDefinitionKey(key)例如&#xff1a;用户或者程…

力扣11.盛最多水的容器(双指针解法)

问题描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

Mini MP3 Player播放器简介与STC12例程

文章目录1、DFRobot arduino DFPlayer官方资料1-1、简介2-2、 基本功能详述1-3、 用途1-4、 引脚说明1-5、工作模式1-5-1、 串口工作模式1-5-2、 ADC按键工作模式1-5-3、 普通按键工作模式2、串口模式电路搭建与例程参考文献1、DFRobot arduino DFPlayer官方资料 1-1、简介 Th…

KingbaseES运维案例之---服务进程(backend process)终止

​ 案例说明&#xff1a; 如下图所示&#xff1a;KingbaseES服务进程结构 KingbaseES使用客户端/服务器的模型。 对于每个客户端的连接&#xff0c;KingbaseES主进程接收到客户端连接后&#xff0c;会为其创建一个新的服务进程。 KingbaseES 用服务进程来处理连接到数据库服务的…

Java Swing JTextField:单行文本框组件

Swing 中使用 JTextField 类实现一个单行文本框&#xff0c;它允许用户输入单行的文本信息。该类的常用构造方法如下。 JTextField()&#xff1a;创建一个默认的文本框。JTextField(String text)&#xff1a;创建一个指定初始化文本信息的文本框。JTextField(int columns)&…

Nacos学习笔记 (4)Nacos整合SpringBoot流程

前提&#xff0c;先下载Nacos并启动 Nacos Server。 1. Nacos 融合 Spring Boot 为注册配置中心 实现&#xff1a; 通过 Nacos Server 和 nacos-config-spring-boot-starter 实现配置的动态变更&#xff1b;通过 Nacos Server 和 nacos-discovery-spring-boot-starter 实现服…

OpenAI 3D 模型生成器Point-E极速体验

OpenAI 3D 模型生成器Point-E极速体验 3090显卡&#xff0c;极速体验三维模型生成&#xff0c;体验地址&#xff1a;Gradio 文本生成图像的 AI 最近已经火到了圈外&#xff0c;不论是 DALL-E 2、DeepAI 还是 Stable Diffusion&#xff0c;人人都在调用 AI 算法搞绘画艺术&…

Unreal Engine工程项目目录及对应作用

目录 .vs Binaries&#xff1a;编译文件 Config&#xff1a;配置文件 Content&#xff1a;资产文件 DerivedDataCache&#xff1a;UE针对平台特化的资源版本 Intermediate&#xff1a;中间文件 Saved&#xff1a;自动保存的内容 Source&#xff1a;源&#xff08;代码&…

ADI Blackfin DSP处理器-BF533的开发详解66:MP3解码(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了读取工程目录下的一个 MP3 文件&#xff0c;对文件进行解码后&#xff0c;将生成的数据以 PCM 文件的形式保存在工程目录…