Java API 之集合框架进阶
前言: 本文主要讲解集合框架中的List、Set、Map接口中的进阶知识,主要是分析其底层原理和优缺点。
1. List 接口
1.1 ArrayList
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {// 创建一个ArrayList对象,初始容量为10List<String> list = new ArrayList<>(10);// 添加元素list.add("Apple");list.add("Banana");list.add("Orange");// 打印列表内容System.out.println(list); // 输出: [Apple, Banana, Orange]// 访问元素System.out.println(list.get(1)); // 输出: Banana// 插入元素list.add(1, "Grape"); // 在索引1处插入元素System.out.println(list); // 输出: [Apple, Grape, Banana, Orange]// 删除元素list.remove(2); // 删除索引2处的元素System.out.println(list); // 输出: [Apple, Grape, Orange]}
}
底层原理分析:
-
动态数组: ArrayList 底层使用一个数组来存储元素。
-
扩容机制: 当数组空间不足时,会创建一个新的更大容量的数组,将原数组元素复制到新数组中。扩容因子通常为 1.5,这意味着每次扩容,新数组的容量是原数组容量的 1.5 倍。例如,如果初始容量为 10,当添加第 11 个元素时,会创建一个容量为 15 的新数组,并将原数组元素复制到新数组中。
-
优点: 随机访问效率高,可以通过索引直接访问元素。
-
缺点: 插入和删除元素效率较低,尤其是对于中间位置的元素。因为需要移动后面的元素才能插入或删除元素。
1.2 LinkedList
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {// 创建一个LinkedList对象List<String> list = new LinkedList<>();// 添加元素list.add("Apple");list.add("Banana");list.add("Orange");// 打印列表内容System.out.println(list); // 输出: [Apple, Banana, Orange]// 访问元素System.out.println(list.get(1)); // 输出: Banana// 插入元素list.add(1, "Grape"); // 在索引1处插入元素System.out.println(list); // 输出: [Apple, Grape, Banana, Orange]// 删除元素list.remove(2); // 删除索引2处的元素System.out.println(list); // 输出: [Apple, Grape, Orange]}
}
底层原理分析:
-
双向链表: LinkedList 底层使用双向链表来存储元素。每个节点包含元素和指向前驱节点和后继节点的指针。
-
优点: 插入和删除元素效率高,尤其是在头部或尾部。因为只需要修改指针即可,不需要移动元素。
-
缺点: 随机访问效率较低,需要从头部或尾部开始遍历。
2. Set 接口
2.1 HashSet
import java.util.HashSet;
import java.util.Set;public class HashSetExample {public static void main(String[] args) {// 创建一个HashSet对象Set<String> set = new HashSet<>();// 添加元素set.add("Apple");set.add("Banana");set.add("Orange");set.add("Apple"); // 重复元素不会被添加// 打印集合内容System.out.println(set); // 输出: [Banana, Apple, Orange] (顺序可能不同)// 判断元素是否存在System.out.println(set.contains("Banana")); // 输出: true}
}
底层原理分析:
-
哈希表: HashSet 底层使用哈希表来存储元素。哈希表是一种使用哈希函数将元素映射到数组中的特定位置的数据结构。
-
哈希冲突: 当多个元素的哈希值相同,就会发生哈希冲突。HashSet 使用链表或红黑树来解决哈希冲突。
-
优点: 元素查找效率高。
-
缺点: 元素顺序不固定。
2.2 TreeSet
import java.util.TreeSet;
import java.util.Set;public class TreeSetExample {public static void main(String[] args) {// 创建一个TreeSet对象Set<String> set = new TreeSet<>();// 添加元素set.add("Apple");set.add("Banana");set.add("Orange");// 打印集合内容System.out.println(set); // 输出: [Apple, Banana, Orange] (有序)// 判断元素是否存在System.out.println(set.contains("Banana")); // 输出: true}
}
底层原理分析:
-
红黑树: TreeSet 底层使用红黑树来存储元素。红黑树是一种自平衡二叉搜索树,可以保证元素有序,并提供高效的查找、插入和删除操作。
-
优点: 元素有序,查找效率高。
-
缺点: 插入和删除元素效率相对较低。
3. Map 接口
3.1HashMap
import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {// 创建一个HashMap对象Map<String, Integer> map = new HashMap<>();// 添加元素map.put("Apple", 1);map.put("Banana", 2);map.put("Orange", 3);// 获取元素System.out.println(map.get("Banana")); // 输出: 2// 判断元素是否存在System.out.println(map.containsKey("Apple")); // 输出: true}
}
底层原理分析:
-
哈希表: HashMap 底层使用哈希表来存储键值对。
-
哈希冲突: 当多个键的哈希值相同,就会发生哈希冲突。HashMap 使用链表或红黑树来解决哈希冲突。
-
优点: 查找效率高。
-
缺点: 元素顺序不固定。
3.2 TreeMap
import java.util.TreeMap;
import java.util.Map;public class TreeMapExample {public static void main(String[] args) {// 创建一个TreeMap对象Map<String, Integer> map = new TreeMap<>();// 添加元素map.put("Apple", 1);map.put("Banana", 2);map.put("Orange", 3);// 打印Map内容System.out.println(map); // 输出: {Apple=1, Banana=2, Orange=3} (有序)// 获取元素System.out.println(map.get("Banana")); // 输出: 2// 判断元素是否存在System.out.println(map.containsKey("Apple")); // 输出: true}
}
底层原理分析:
-
红黑树: TreeMap 底层使用红黑树来存储键值对。
-
优点: 元素有序,查找效率高。
-
缺点: 插入和删除元素效率相对较低。
结语:以上就是关于 List、Set、Map接口中的进阶知识详解,希望对各位看官有所帮助,感谢各位看官的观看,下期见,谢谢~
相关文章:
Java API 之集合框架进阶
前言: 本文主要讲解集合框架中的List、Set、Map接口中的进阶知识,主要是分析其底层原理和优缺点。 1. List 接口 1.1 ArrayList import java.util.ArrayList; import java.util.List;public class ArrayListExample {public static void main(String[] …...
Java String isEmpty()方法
在Java中,String 类的 isEmpty() 方法用来检测一个字符串是否为空。以下是一些关于此方法的关键信息: 方法声明:public boolean isEmpty()功能:通过检查字符串的长度来判断字符串是否为空。返回值:如果字符串为空则返…...
Redisson分布式锁分析,可重入、可续锁(看门狗)
前言 在此说明,本文章不只是讲一些抽象的概念,而是可落地的,在日常工作中基本上进行修改一下便可以使用。书接上回,上篇自研分布式锁的文章使用是一个自己手写的一个分布式锁,按照JUC里面java.util.concurrent.locks.L…...
C++掉血迷宫
目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好,我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…...
Spring Boot- 数据库相关问题
Spring Boot 与数据库相关问题及其解决方案 1. 引言 Spring Boot简化了Java企业级应用的开发,尤其在与数据库交互方面提供了诸多便利。Spring Boot提供了多种数据库集成方案,涵盖关系型数据库(如MySQL、PostgreSQL等)与非关系型…...
秒懂C++之特殊类设计
目录 设计一个类,不能被拷贝 设计一个类,只能在堆上创建对象 设计一个类,只能在栈上创建对象 设计一个类,无法被继承 设计一个类,只能创建一个对象(单例模式) 饿汉模式 懒汉模式 设计一个类,不能被拷…...
人工智能学习
🌐前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 👉【点击跳转到网站:人工智能教程】 什么是人工智能?通俗来讲,就是让机器能像人一样思考。这…...
WINDOWS AGENTARENA:EVALUATING MULTI-MODAL OS AGENTS AT SCALE论文学习
文章开头说现有的agent都是局限于特定领域(什么网络问答啊,仅限文字啊,仅限于某一个app啊)这样的,本文的工作主打一个贴近用户使用场景,用户用什么软件,看什么网页,本文的模型就用什…...
3步轻松定制报价方案,亿发商城报价神器你用过了吗?
如果您正寻求突破传统业务模式的束缚,希望拥抱数字化转型带来的无限可能,我们诚邀您体验亿发软件。亿发专业团队将为您提供个性化的咨询和定制服务,帮助您的企业快速适应市场变化,实现业务模式和商业模式的创新。...
CISP备考题库(五)
在当今这个飞速发展的数字化时代,信息安全已跃居至前所未有的战略地位,其重要性伴随着技术的日新月异而持续攀升,成为了一个不容小觑的关键领域。为了激发并引领广大青年才俊积极投身于网络安全专家的崇高事业,我们精心策划并编纂…...
【Kubernetes】常见面试题汇总(二十三)
目录 69.考虑一家拥有分布式系统的跨国公司,拥有大量数据中心,虚拟机和许多从事各种任务的员工。您认为这样公司如何以与 Kubernetes 一致的方式管理所有任务? 70.考虑一种情况,即公司希望通过维持最低成本来提高其效率和技术运营…...
linux-Shell 编程-Shell 脚本基础
Linux Shell 编程:Shell 脚本基础 在Linux系统中,Shell脚本是一种强大的自动化工具。通过编写Shell脚本,用户可以自动化重复性任务、系统管理操作和程序控制流程,极大提高工作效率。 1. 什么是Shell脚本? Shell脚本是…...
Linux运维篇-tigervnc工具的使用
目录 简介下载使用clientserver配置文件服务管理 设定密码(先切换成对应的用户):配置多用户的VNC tigervnc连接排错一、vnc密码错误二、vncserver端口忘记了三、连接很卡,或者画面没有反应四、服务报错 简介 TigerVNC是VNC的一种…...
基于Spark的电影推荐系统设计与实现(论文+源码)_kaic
摘 要 在云计算、物联网等技术的带动下,我国已步入大数据时代。电影是人们日常生活中重要的一种娱乐方式,身处大数据时代,各种类型、题材的电影层出不穷,面对琳琅满目的影片,人们常感到眼花缭乱。因此,如…...
基于python+django+vue的医院预约挂号系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…...
镀金引线---
一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式,它们各有优劣势,选择哪种方式取决于具体的应用需求和预算。 沉金(ENIG)是一种常用的金手指处理方式,它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…...
『功能项目』窗口可拖拽脚本【59】
本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目, 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本:DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…...
Map--08--CurrentHashMap 与 Hashtable的异同?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Map方法computeIfAbsent1.computeIfAbsent 方法的简介2.案例computeIfAbsent() Map方法computeIfAbsent computeIfAbsent方法是Java 8中引入的一种简化操作Map的方…...
Docker学习笔记(三)存储与卷
挂载机制介绍 我们都知道,默认下,Docker容器与宿主机是完全隔离的,这种特性使得我们创建与删除容器都变得更方便,不需要再去删除宿主机上容器遗留下来的痕迹。 但是,当我们使用数据库一类需要持久化数据、共享数据…...
硬件工程师笔试面试——滤波器
目录 12、滤波器 12.1 基础 滤波器原理图 滤波器实物图 12.1.1 概念 12.1.2 滤波器的分类 12.1.3 滤波器的工作原理 12.1.4 滤波器的应用 12.1.5 滤波器设计的关键参数 12.2 相关问题 12.2.1 不同类型的滤波器在实际应用中的具体作用是什么? 12.2.2 如何设计一个简…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
