当前位置: 首页 > news >正文

Java集合1.0

1.什么是集合?

集合就是一个存放数据的容器,准确的说是放数据对象引用的容器。

集合和数组的区别

  • 数组是固定长度,集合是可变长度。
  • 数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型;
  • 数组存储的元素必须是同一个数据类型,集合存储的对象可以是不同的数据类型。

使用集合框架的好处

  • 容量自增长;
  • 提供了高性能的数据结构和算法,使得编码更轻松,提高了程序速度和质量;
  • 允许不同API之间相互操作,API之间可以来回传递集合;
  • 可以方便的扩展或改写集合,提高了代码的复用性和可操作性;
  • 通过使用JDK自带的集合类,可以降低代码维护和学习新API的成本;

2.常用的集合类有哪些?

Map接口和Collection接口是所有集合框架的父接口:

  1. Collection接口的子接口包括:Set接口和List接口,Queue接口;
  2. Map接口的实现类主要有:HashMap,TreeMap,HashTable,ConcurrentHashMap;
  3. Set接口的实现类主要有:HashSet,TreeSet,LinkedHashSet;
  4. List接口的实现类主要有:ArrayList,LinkedList,Stack,Vector;

3.List,Set,Map三者的区别?

  • List:
  1. 可以允许重复对象
  2. 可以插入多个null对象
  3. 是一个有序的容器,保持了每个元素的插入顺序,它的输出顺序就是插入顺序;
  4. 常用的实现类有ArrayList,LinkedList,Vector。
  • Set:
  1. 不允许重复对象
  2. 无序容器,没法保证每个元素的存储顺序,TreeSet通过Comparator或者Comparable维护了一个排序顺序
  3. 只允许一个null元素
  4. 常用的实现类是HashSet,LinkedHashSet,TreeSet
  • Map:
  1. Map里你可以拥有随意个null值,但只能有一个null键
  2. 常用的是实现类:HashMap,TreeMap,Hashtable,LinkedHashMap;

4.集合框架底层数据结构

List接口

1.ArrayList

  • 底层数据结构:动态数组
  • 特点:基于动态数组实现,数组在存储元素时是连续的内存空间;当数组容量不足时会自动扩容,通常为原容量的1.5倍;随机访问元素时O(1)的时间复杂度,但在插入或者删除元素时为O(n);

2.LinkedList

  • 底层数据结构:双向链表
  • 特点:基于双向链表实现,每个节点包含一个数据元素以及指向前后节点的两个指针;插入和删除操作O(1);随机访问O(n),因为需要从头或者尾部开始遍历链表;

3.Vector

  • 底层数据结构:动态数组
  • 特点:Vector时线程安全的,每个方法都被sychronized关键字修饰,因此在多线程环境下会出现数据不一致的问题;性能比ArrayList较差
  • 适用场景:适合多线程环境中需要频繁访问的场景,但由于Vector的性能开销,一般推荐ArrayList和同步机制配合使用;

Set接口

1.HashSet

  • 底层数据结构:哈希表
  • 特点:基于HashMap实现,哈希表使用散列函数来计算每个元素的哈希值,并将元素存储在相应的哈希桶中;HashSet不保证集合的顺序,插入,删除,查找操作的时间复杂度为O(1);允许一个null值;
  • 适用场景:需要快速查找,插入,删除,并且不关心元素顺序的场景

2.LinkedHashSet

  • 底层数据结构:链表和哈希表
  • 特点:继承自HashSet,但维护者一个双向链表以保证插入顺序;

3.TreeSet

  • 底层数据结构:红黑树(自平衡的二叉搜索树)
  • 特点:基于TreeMap实现;元素的顺序是根据提供的比较器来排序的,插入删除查找操作为O(logn);不允许null值,因为null无法比较

Map接口

1.HashMap

  • 底层数据结构:哈希表和链表/红黑树
  • 特点:基于哈希表实现,使用散列函数计算键的哈希值并将键值对存储在相应的哈希桶中;当哈希冲突发生时,HashMap使用链表来存储冲突的元素。从Java 8开始,当链表长度超过一定阈值(默认8)时,链表会转换为红黑树,以提高查找和删除效率。

2.LinkedHashMap

  • 底层数据结构:链表和哈希表
  • 特点:除了使用哈希表存储键值对外,还维护了一个双向链表来记录元素的插入顺序或访问顺序。

3.TreeMap

  • 底层数据结构:红黑树
  • 特点:底层基于红黑树实现,键值对按键的自然顺序或自定义比较器排序;不允许null键;
  • 场景:适合需要键值对有序排列和范围查找的场景。

4.Hashtable

  • 底层数据结构:哈希表
  • 特点:和HashMap类似,但Hashtable是线程安全的,所有方法都被synchronized修饰。
  • 场景:适合多线程环境下线程安全的键值对存储

5.哪些集合类是线程安全的?

  1. Vector:Vector 是一个古老的动态数组实现,所有的方法都被 synchronized 关键字修饰,因此是线程安全的。然而,由于性能较差,不推荐在现代代码中使用。
  2. Hashtable:Hashtable 是一个古老的哈希表实现,也是线程安全的,所有的方法都被 synchronized 关键字修饰。和 Vector 一样,由于性能原因,现在一般推荐使用 HashMap
  3. ConcurrentHashMap:ConcurrentHashMap 是 Java 5 及以后版本引入的并发哈希表实现。它采用分段锁机制,支持高并发的读和写操作,是一个高性能的线程安全集合类

相关文章:

Java集合1.0

1.什么是集合? 集合就是一个存放数据的容器,准确的说是放数据对象引用的容器。 集合和数组的区别 数组是固定长度,集合是可变长度。数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型&…...

Leetcode 336 回文对

示例 1: 输入:words ["abcd","dcba","lls","s","sssll"] 输出:[[0,1],[1,0],[3,2],[2,4]] 解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","sl…...

实现一个可配置的TCP设备模拟器,支持交互和解析配置

前言 诸位在做IOT开发的时候是否有遇到一个问题,那就是模拟一个设备来联调测试,虽然说现在的物联网通信主要是用mqtt通信,但还是有很多设备使用TCP这种协议交互,例如充电桩,还有一些工业设备,TCP这类报文交…...

算法的空间复杂度

空间复杂度 空间复杂度主要是衡量一个算法运行所需要的额外空间,在计算机发展早期,计算机的储存容量很小,所以空间复杂度是很重要的。但是经过计算机行业的迅速发展,计算机的容量已经不再是问题了,所以如今已经不再需…...

自定义协议

1. 问题引入 问题:TCP是面向字节流的(TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列,即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分,它只是确保数据的顺序和完整…...

在 Taro 中实现系统主题适配:亮/暗模式

目录 背景实现方案方案一:CSS 变量 prefers-color-scheme 媒体查询什么是 prefers-color-scheme?代码示例 方案二:通过 JavaScript 监听系统主题切换 背景 用Taro开发的微信小程序,需求是页面的UI主题想要跟随手机系统的主题适配…...

autogen框架中使用chatglm4模型实现react

本文将介绍如何使用使用chatglm4实现react,利用环境变量、Tavily API和ReAct代理模式来回答用户提出的问题。 环境变量 首先,我们需要加载环境变量。这可以通过使用dotenv库来实现。 from dotenv import load_dotenv_ load_dotenv()注意.env文件处于…...

读《Effective Java》笔记 - 条目9

条目9:与try-finally 相比,首选 try -with -resource 什么是 try-finally? try-finally 是 Java 中传统的资源管理方式,通常用于确保资源(如文件流、数据库连接等)被正确关闭。 BufferedReader reader n…...

【软件入门】Git快速入门

Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…...

nextjs window is not defined

问题产生的原因 在 Next.js 中,“window is not defined” 错误通常出现在服务器端渲染(Server - Side Rendering,SSR)的代码中。这是因为window对象是浏览器环境中的全局对象,在服务器端没有window这个概念。例如&am…...

C语言实现冒泡排序:从基础到优化全解析

一、什么是冒泡排序? 冒泡排序(Bubble Sort)是一种经典的排序算法,其工作原理非常直观:通过多次比较和交换相邻元素,将较大的元素“冒泡”到数组的末尾。经过多轮迭代,整个数组会变得有序。 二…...

windows11下git与 openssl要注意的问题

看了一下自己贴文的历史,有一条重要的忘了写了。 当时帮有位同事配置gitlab,众说周知gitlab是不太好操作。 但我还是自认自己git还是相当熟的。 解决了一系列问题,如配置代理,sshkey,私有库,等等&#xff0…...

lua除法bug

故事背景,新来了一个数值,要改公式。神奇的一幕出现了,公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…...

Ubuntu下Docker容器java服务往mysql插入中文数据乱码

一、问题描述 1、java服务部署在ubuntu下的docker容器内,但是会出现部分插入中文数据显示乱码,如图所示: 二、解决方案 1、查看mysql是否支持utf8,登录进入Mysql 输入命令: mysql -u root -pshow variables like c…...

C语言根据字符串变量获取/设置结构体成员值

一、背景 在项目中需要根据从数据库中获取的字段与对应的键值付给对应结构体成员上,而c语言中没有类似的反射机制,所以需要实现类似功能。例,从表中查到a 10,在结构体t中,需要将 t.a 10。 二、实现 感谢ChatGPT&…...

Selenium 自动化测试demo

场景描述: 模拟用户登录页面操作,包括输入用户名、密码、验证码。验证码为算数运算,如下: 使用到的工具和依赖: 1. Selenium:pip install selenium 2. 需要安装浏览器驱动:这里使用的是Edge 3…...

LeetCode 111.二叉树的最小深度

题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路:自底向上(归)/自顶向下(递) DF…...

大工C语言作业答案

前言 这里是大连理工大学新版C语言课程MOOC作业的答案。 后期我会把全部的作业答案开源出来&#xff0c;希望对大家有帮助。 第九周第一题 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int B(int i) {int sum 1;while (i > 0){sum i * sum;i--;}return su…...

【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象

The game object is deformed when the parent object is in non-uniform scaling. 先来看一下现象 有两个Cube, Cube1&#xff08;Scale2,1,1)&#xff0c;Cube2&#xff08;Scale1,1,1&#xff09; 将Cube2拖拽为Cube2的子对象。并且将position设置为&#xff08;-0.6,1,0&a…...

QT 跨平台实现 SSDP通信 支持多网卡

一.多网卡场景 在做SSDP通信的时候,客户端发出M-search命令后, 主机没有捕捉到SSDP的消息,你可以查看下,是不是局域网下,既打开了wifi,又连接了本地网络,mac os下很容易出现这种场景。此时,我们发送消息时,需要遍历所有网卡并发送M-search命令。 二.QT相关接口介绍 1…...

Pytorch图像去噪实战(七十四):Kubernetes部署图像去噪服务,实现容器编排和弹性扩展

Pytorch图像去噪实战(七十四):Kubernetes部署图像去噪服务,实现容器编排和弹性扩展 一、问题场景:Docker Compose够用,但多服务扩展开始吃力 前面我们用 Docker Compose 部署了图像去噪服务。 Compose 对单机部署非常好用,但当项目变复杂后,会遇到: 多台机器部署困难…...

多渠道订单数据处理自动化,落地步骤与ERP打通方案 | 2026企业级智能体实战手册

在2026年的数字化转型深水区&#xff0c;企业面临的不再是“是否要自动化”的问题&#xff0c; 而是如何在高并发、多维度的全渠道业务压力下&#xff0c; 实现订单流、资金流与信息流的绝对同步。 传统的OMS&#xff08;订单管理系统&#xff09;与ERP&#xff08;企业资源计划…...

ML:SARSA 的基本原理与实现

在强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;并不是一次性从已有标签中学习答案&#xff0c;而是在环境&#xff08;Environment&#xff09;中不断尝试动作、观察结果、获得奖励&#xff0c;并根据经验逐步调整行为策略。在 Q 学习中&#xff0c;智能体可以通…...

第七部分-容器安全与监控——33. 镜像安全

33. 镜像安全 1. 镜像安全概述 镜像是容器的基石&#xff0c;镜像安全问题直接影响容器运行时安全。镜像安全涵盖基础镜像选择、镜像构建过程、镜像存储和分发等环节。 ┌─────────────────────────────────────────────────…...

终极ComfyUI视频插件指南:从零开始构建AI视频生成工作流

终极ComfyUI视频插件指南&#xff1a;从零开始构建AI视频生成工作流 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 你是否曾梦想过让静态图片“活”起来&#xff0c;或者让文字描述直接变成生动…...

如何快速掌握LeRobot:从零开始部署机器人AI的完整实践指南

如何快速掌握LeRobot&#xff1a;从零开始部署机器人AI的完整实践指南 【免费下载链接】lerobot &#x1f917; LeRobot: Making AI for Robotics more accessible with end-to-end learning 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot 想要将最先进的A…...

从云原生到边原生:AI营销一体机如何重构企业的“数字孪生”基础设施?

摘要&#xff1a;​ 随着大模型参数量的激增&#xff0c;传统的“端-管-云”架构在处理高频营销任务时遭遇了带宽与延迟的瓶颈。本文将探讨“边原生&#xff08;Edge-Native&#xff09;”架构的崛起&#xff0c;并以卡特加特AI营销一体机为例&#xff0c;解析如何利用本地化超…...

AI智能体构建实战:从架构设计到工程落地的关键挑战与解决方案

1. 项目概述&#xff1a;揭开AI智能体构建的隐秘面纱 “构建AI智能体”&#xff0c;这听起来像是当下最酷、最前沿的技术话题。无论是科技新闻还是行业论坛&#xff0c;你都能看到无数关于智能体如何自动化工作流、理解复杂指令、甚至自主决策的激动人心的讨论。然而&#xff0…...

【HAL库实战】STM32F407通过I2C驱动MPU6050全解析

1. 硬件连接与CubeMX配置 第一次用STM32F407驱动MPU6050时&#xff0c;我对着开发板愣了半天——为啥官方例程用的PB6/PB7引脚&#xff0c;我的模块却要接PB8/PB9&#xff1f;后来才发现这是I2C引脚重映射的典型场景。先看硬件接线要点&#xff1a; 物理连接&#xff1a;MPU6…...

如何快速掌握SRWE:Windows窗口分辨率自定义完整教程

如何快速掌握SRWE&#xff1a;Windows窗口分辨率自定义完整教程 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾遇到过游戏窗口大小不合适、截图分辨率不够高&#xff0c;或者想要为特定应用程序设置独…...