Java高级架构师-集合框架使用原理分析

java 集合框架的原理及其使用 Java集合框架 系统的介绍java集合框架的应用 立即下载

集合是我们日常编程中可能用的很多的技术之一 使用频率极高 可能平时就会知道怎么去用 但是集合之间的关系与不同之处都不是很清楚 对它们的底层原理更甚 所以写词文章 让自己有一个更深的认识

集合是一个庞大的家族 今天先来说说这几个 ArrayList、LinkedList、Vector

Java高级架构师-集合框架使用原理分析

 

 

ArrayList 由于它的底层是数组 数组我们都知道它的查询修改都是效率很高的 ArrayList也是如此 但是为什么查询修改效率高 插入和删除效率低较低呢 这就跟它的数据结构有关系呢 接下啦我们来看看ArrayList数据结构模型

插入、删除:如果我们要想集合中插入一个数100 它的操作步骤是 先在集合中把要插入的位置的数32复制一份 然后再把后面的数往后移 我们不仅要复制数据 而且还要将数据往后移 如果这个集合的数据很多的话 那效率就会很低 进行删除的话后面的数据复制一份 同时数据都要像前面移动 效率也很低

查询、修改: 修改如果进行查询 我们只需要通过数组下标就可以定位到数据 所以效率高 实际开发中 我们大部分是进行查询数据 所以ArrayList使用很广泛

任何事物都有两面性 不管是生活中 还是工作中 在编程也是同样适用的(因为编程也是人发明出来的嘛) 为了解决ArrayList的这一短板 聪明的程序员就使用另一个集合

Java高级架构师-集合框架使用原理分析

 

 

ArrayList 增删改查的源码

从源码我们可以看出 不管是插入和删除元素的时候 ArrayList都会复制数组操作 这也就导致了它的效率不高

 1 //查询元素
 2 public E get(int index) {
 3 //检查元素是否越界
 4 rangeCheck(index);
 5 
 6 return elementData(index);
 7 }
 8 
 9 
10 //按顺序添加元素
11 public boolean add(E e) {
12 //确认开启扩容机制 
13 ensureCapacityInternal(size + 1); // Increments modCount!!
14 elementData[size++] = e;
15 return true;
16 }
17 
18 //在指定位置插入元素
19 public void add(int index, E element) { 
20 //检查索引是否越界
21 rangeCheckForAdd(index);
22 //确认开启扩容机制
23 ensureCapacityInternal(size + 1); // Increments modCount!!
24 //复制数组
25 System.arraycopy(elementData, index, elementData, index + 1,
26 size - index);
27 //替换元素
28 elementData[index] = element;
29 size++;
30 }
31 
32 
33 
34 
35 //移除某个元素
36 public E remove(int index) {
37 rangeCheck(index);
38 
39 modCount++;
40 E oldValue = elementData(index);
41 
42 int numMoved = size - index - 1;
43 if (numMoved > 0)
 //复制数组
44 System.arraycopy(elementData, index+1, elementData, index,
45 numMoved);
46 elementData[--size] = null; // clear to let GC do its work
47 
48 return oldValue;
49 }
50 
51 
52 

LinkedList

LinkedList它的底层是双向链表实现的非线程安全的集合,它是一个链表结构,不能像数组一样随机访问,必须是每个元素依次遍历直到找到元素为止。其结构的特殊性导致它查询数据慢。 接下来我们来看看它的结构模型

插入、删除 :因为是链表结构 所以它的插入效率很高 (如果在14 和 18之间插入一个33 的话,链表直接会将连接到18的链子断开 然后连接上33所在的前节点 数据18的前节点再连接上33的后节点 如图2所示) 也就是说 插入一个数字我们只需要将(14 和 18 之间的)链表断开 再将14和33之间的链表连上即可 比ArrayList的数组复制效率高

查询、修改 :LinkedList 查询速度慢 因为它要遍历整个整个集合 直到找到元素为止 如果集合数组多的话 消耗的资源就多 而ArrayList是通过数组下标定位速度快 同样他也是线程不安全的

Java高级架构师-集合框架使用原理分析

 

 

Java高级架构师-集合框架使用原理分析

 

 

linkedList

在执行查询时 先判断元素是靠近头部还是尾部 如果是头部 若靠近头部,则从头部开始依次查询判断

执行插入时 判断是插入到中间还是尾部 如果插入到尾部 直接将尾节点的下一个指针指向新增节点。如果插入到中间 获取到当前节点的上一个节点(D) 并将D节点的后指针指向新的节点头指针 然后新增节点的下一个指针指向当前节点。

 1 //查询元素 
 2 public E get(int index) {
 3 //检查所引是否越界
 4 checkElementIndex(index);
 5 return node(index).item;
 6 }
 7 
 8 // 返回指定索引处的节点
 9 Node<E> node(int index) {
10 // 指定的索引值与链表大小右移一位,及除以 2 进行比较
11 if (index < (size >> 1)) { // 索引小,则从首节点向后扫描,直到索引值处
12 Node<E> x = first;
13 for (int i = 0; i < index; i++)
14 x = x.next;
15 return x;
16 } else { // 索引大,则从尾节点向前扫描,直到索引值处
17 Node<E> x = last;
18 for (int i = size - 1; i > index; i--)
19 x = x.prev;
20 return x;
21 }
22 }
23 
24 
25 //移除指定元素
26 public E remove(int index) {
27 checkElementIndex(index);
28 return unlink(node(index));
29 }
30 
31 //在指定位置添加元素
32 public void add(int index, E element) {
33 //检查所引是否越界 
34 checkPositionIndex(index);
35 // 在链表末尾天添加
36 if (index == size)
37 linkLast(element);
38 else
39 linkBefore(element, node(index));
40 }
41 
42 private static class Node<E> {
43 E item;
44 //头节点
45 Node<E> next;
46 //尾节点
47 Node<E> prev;
48 Node(Node<E> prev, E element, Node<E> next) {
49 this.item = element;
50 this.next = next;
51 this.prev = prev;
52 }
53 }
54 
55 /**
56 * Links e as last element.
57 */
58 void linkLast(E e) {
59 //用l来临时保存未插入前的last节点
60 final Node<E> l = last;
61 //创建一个值为e的新节点 添加第一个元素时 l = null
62 final Node<E> newNode = new Node<>(l, e, null);
63 //将新节点赋值的last
64 last = newNode;
65 if (l == null)
66 first = newNode;
67 else
68 l.next = newNode;
69 size++;
70 modCount++;
71 }

Vector

Vector的数据结构和使用方法 跟ArrayList相同 不同之处在于Vector是线程安全的 几乎所有的对数据操作的方法都被synchronized关键字修饰 synchronized是线程同步的 当一个线程获得Vector对象锁的时候 其它的线程必须等到它执行完毕之后(锁被释放)才能执行

Java高级架构师-集合框架使用原理分析

 

 

总结

1.ArrayList 它的底层是一个数组 查询修改数据快(通过下标定位) 但是插入删除数据比较慢 (插入数据慢是因为复制数组耗时) 为了改进这个缺点 于是就有了LinkedList数组 它是一个链表结构 插入和删除数据很快(只需要修改指针引用) 但是查询和修改数效率低(他要查询到整个链表从第一个开始寻找 一直找到为止)

2.ArrayList 和LinkedList都是线程不安全的

3.Vector是线程安全的 但是效率低 当我们执行单个线程的时候ArrayList的效率高于Vector

 

欢迎做Java的朋友们加小编的交流群(785779447)免费获取免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)
其中覆盖了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,很值得大家借鉴和学习,扩展自己的技术广度和知识面。

PostgreSQL中idle in transaction状态的5个隐藏危害及实战解决方案 本文深入剖析了PostgreSQL中`idle in transaction`连接状态的五大隐藏危害,包括内存与锁泄漏、VACUUM受阻导致表膨胀、事务ID加速消耗、连接池资源耗尽以及增加故障排查复杂度。文章提供了基于`pg_stat_activity`视图的监控方法、识别高危事务的SQL脚本,并给出了从数据库参数调优(如设置`idle_in_transaction_session_timeout`)到应用层编码规范与连接池配置的完整实战解决方案。 阅读详情

相关推荐

保姆级教程:用Python脚本一键把选股结果导入通达信自选股(附完整代码)

本文提供了一份详细的Python自动化教程,教你如何将选股结果一键导入通达信自选股。通过解析通达信文件结构、编写Python脚本实现股票代码转换和批量导入,大幅提升量化交易效率。教程包含完整代码示例,特别适合使用通达信(TDX)的投资者和量化交易开发者。

weixin_30915951的博客 358

Java集合框架全面详解

集合框架是一个统一的架构,用于表示和操作集合,使集合能够独立于其实现细节进行操作。Java集合框架提供了一系列接口和类,用于存储、检索、操作和传输数据对象。尽管Java集合框架提供了丰富的实现,但有时您可能需要创建自定义的集合类。扩展现有集合类@Override@Override实现集合接口size = 0;@Override@Override@Override// 省略其他必要的方法实现...使用组合而非继承@Override。

qq_38830315的博客 2211

拆解大疆M300电池BMS:基于TI TIDA-010030方案的硬件架构深度分析

本文深度解析了大疆M300无人机电池管理系统(BMS)基于TI TIDA-010030参考设计的硬件架构。通过对比TI方案与大疆实现的差异,详细介绍了BQ7694003监控前端和BQ34Z100电量计的优化设计,以及通信架构的可靠性改进。文章还揭示了大疆在成本、空间和标准化方面的工程妥协与创新平衡,为锂电池保护方案提供了实践参考。

weixin_27066963的博客 238

java集合框架

Java集合框架是Java编程中最重要的一部分之一,提供了许多数据类型,如List,Set,Map等,可以帮助在程序中管理和操作数据。其中List和Set是继承自Collection接口,而Map则是独立的接口。下面我将会讲解它们的底层原理以及提供案例代码来帮助理解。

qq_59093385的博客 209

VirtualBox安装Win10虚拟机超详细教程(附微软官方镜像下载)

本文提供了一份详细的VirtualBox安装Win10虚拟机教程,涵盖从环境准备、工具下载到系统安装与初始配置的全过程。特别推荐使用微软官方镜像下载,确保系统纯净安全。此外,还分享了性能优化技巧和常见问题解决方案,帮助用户高效搭建稳定的Windows测试环境。

weixin_29243279的博客 918

STM32串口DMA双缓冲机制实战:提升数据传输效率的终极方案

本文深入解析了STM32串口DMA双缓冲机制的核心原理与实战配置。通过对比传统中断方式,阐述了双缓冲如何实现数据接收与处理的“无缝接力”,从而在工业传感器数据采集等高负载场景下,将CPU占用率降至极低水平并彻底避免数据丢失。文章提供了基于标准外设库的详细配置步骤、中断处理逻辑及性能实测数据,是提升嵌入式系统串口通信效率和可靠性的终极方案。

weixin_29192365的博客 80

Java设计思想深究----集合框架数学原理(图文)

你是否看过类似的这样的一张图: 几乎所有的后台开发都会要求,熟悉/精通集合框架。 不用数了,29个类,设计框架者Josh Bloch, Neal Gafter 肯定不是靠记忆去掌握集合框架。 实际上,我们应该清楚编程语言是思想的记录, 掌握集合框架,不妨去深究它背后的思想:数据结构。 没错,又是看得到又仿佛看不到的数据结构。 集合溯源:数据结构 作者理解的数据结构从一个元素开始: 什么是数据结构? | ProcessOn免费在线作图,在线流程图,在线思维导图 | 简而言之:结构是.

kevinmeanscool的博客 1314

从地方政府网站抓取政务公开数据:Python爬虫技术详解

在本文中,我们通过具体实例介绍了如何使用Python编写爬虫,从地方政府门户网站抓取政务公开数据。我们使用了requestsSelenium等最新技术,结合SQLite数据库存储抓取的数据,最后使用matplotlib进行数据可视化分析。通过本项目,您可以掌握如何抓取政府网站的公开数据,并将其进行清洗、存储和分析。这些技术对于进行政府政策分析、公共服务分析等方面具有重要的实际意义。希望通过本文的介绍,您能够更好地理解政务数据抓取的流程和方法,并能在实际工作中运用这些技术进行数据采集和分析。

2201_76125261的博客 1702

java分析集合框架原理汇总

目录 一、List 二、Set 三、Map 首先来一份集合框架图 一、List 1.ArrayList(数组) 1)初始化 无参数 jdk1.7,默认容量为10; jdk1.8,初始化为空数组,add数据时,初始化容量为10。 有参数,根据设置的容量值进行初始化。 2)原理,add时,先判断是否扩容,再存储值,扩容过程有对数组进行复制、移动,代价比较高。...

zhangyoo 304

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。

AI-安全-功耗 1913

保边滤波之Mean shift filter

保边滤波之Mean shift filter 目录 保边滤波之Mean shift filter 一、算法原理 二、练手实现的算法代码如下: 三、实现结果 一、算法原理 在OpenCV中,meanshift filter函数为 p...

大熊 1561

java集合的使用场景桌面_Java高级架构师-集合框架使用原理分析

集合是我们日常编程中可能用的很多的技术之一 使用频率极高 可能平时就会知道怎么去用 但是集合之间的关系与不同之处都不是很清楚 对它们的底层原理更甚 所以写词文章 让自己有一个更深的认识集合是一个庞大的家族 今天先来说说这几个 ArrayList、LinkedList、VectorArrayList 由于它的底层是数组 数组我们都知道它的查询修改都是效率很高的 ArrayList也是如此 但是为什么...

weixin_39607865的博客 65

统计滤波器

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对统计滤波器做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1644

java集合高级_Java高级架构师-集合框架使用原理分析

集合是我们日常编程中可能用的很多的技术之一 使用频率极高 可能平时就会知道怎么去用 但是集合之间的关系与不同之处都不是很清楚 对它们的底层原理更甚 所以写词文章 让自己有一个更深的认识集合是一个庞大的家族 今天先来说说这几个 ArrayList、LinkedList、VectorArrayList 由于它的底层是数组 数组我们都知道它的查询修改都是效率很高的 ArrayList也是如此 但是为什么...

weixin_42523326的博客 80

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java高级架构师之路核心知识整理,这份文档曾帮我拿下BAT等offer

小编整理出一篇Java高级架构师之路的核心知识,同时也是面试时面试官必问的知识点,篇章也是包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等 由于pdf文档里的细节内容实在过多所以只编辑了部分知识点的章节粗略的介绍下,每个章节小节点里面都有更细化的内容!以下就是部分章节目录,由于头条的篇幅限制目录上的详细讲解也无法一一列出,文末底下有获取以

m0_56212833的博客 196

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JAVA高级架构师技术栈:打造卓越的开发技能

--- 希望这篇文章能够帮助您更好地了解和使用**JAVA高级架构师技术栈**项目,祝您在Java开发的道路上越走越远!

gitblog_00024的博客 375

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java高级架构师到底要具备哪些技能?

Java架构师,应该算是一些Java程序员们的一个职业目标了吧。很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力和提出解决方案能力了。我就跟大家来简要地说说吧。 如果你是想成为Java架构师,那么你首先要是一个Java高级攻城狮。也就是说,基础必须牢固,对Java的了解全面而且深入。 熟练使用各种框架,并知道它们实现的原理。 Jvm虚拟机原理、调优操作,懂得jvm能让你写出性能更好的代码; 池技术也是要掌握的,对象池、.

kkkllllss的博客 1412

一位资深Java高级架构师的晋级心得

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34357962的博客 1029

java进阶之路——如何从初级程序员一步步成长为高级架构师

一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的。下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法。 1-1 常用数据结构 数组、链表、堆、栈、队列、Hash表、二叉树等 1-2 算法思想 算法时间复杂度和空间复杂度的分析计算 算法思想:递推、递归、穷举、贪心、分治、动态规划、迭代、分枝界限 1-3...

qq_36860032的博客 839

怎么成为java高级架构师?总结的java架构师学习路线

因此应该是特定的开发平台、语言、工具的大师,对常见应用场景能马上给出最恰当的解决方案,同时要对所属的开发团队有足够的了解,能够评估自己的团队实现特定的功能需求需要的代价。架构分布式的英文( Distributed computing 分布式计算技术)的应用和工具,成熟目前的技术包括 J2EE,CORBA 和 .NET(DCOM),这些技术牵扯的内容非常广,相关的书籍也非常多。微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。

java364100的博客 562

成为一名Java高级架构师到底需要学习什么?

Java架构师,应该算是一些Java程序员们的一个职业目标了吧。很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力和提出解决方案能力了。我就跟大家来简要地说说吧。 如果你是想成为Java架构师,那么你首先要是一个Java高级攻城狮。也就是说,基础必须牢固...

weixin_33810006的博客 84

java架构师_成为一名Java高级架构师究竟要学哪些东西??

Java架构师,应该算是一些Java程序员们的一个职业目标了吧。很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力和提出解决方案能力了。我就跟大家来简要地说说吧。如果你是想成为Java架构师,那么你首先要是一个Java高级攻城狮。也就是说,基础必须牢固,对Java的了解全面而且深入。熟练使用各种框架,并知道它们实...

weixin_39849153的博客 501

java实现逾期提醒_一位Java高级架构师的晋级心得

架构师是什么?是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。所谓架构师,思考的是全局的东西,是如何组织你的系统,以达到业务要求,性能要求,具备可扩展性(scalability),可拓展性(extendability),前后兼容性等。可能涉及到的东西包括了从硬...

weixin_29230059的博客 642

网易云课堂Java高级架构师,Java基础知识总结(绝对经典

7、阿里P2面试失败,注解你都不会吗? 8、Java泛型详解,通俗易懂 9、【Java8 新特性】Lambda表达式总结(全栈最强,绝对豪横) 10、Map、Set、List集合差别及联系详解 11、浅谈Java队列Queue 12、Java性能优化 13、你真的了解“缓存”吗 14、看完这篇,Docker你就入门了 15、Java服务端与C#客户端实现websocket通信(发送消息和文件) 16、tableExport导出 excel报表 17、利用百度语音识别技术实现语音转成文字的应用(Java版附源

m0_60707142的博客 533

Java最牛逼的轻量级框架,不接受反驳!!

如今在java界,Spring可以说是大行其道。很多大厂选择Spring全家桶作为基础开发框架,无数的研发人员把Spring看作是最好的java项目,现在的java开发方面,Spring的重要性和影响力是有目共睹的。市场需求摆在这里,大厂&高薪岗位必备的技术,大街上3-5年工作经验的java程序员一抓一大把,真正产生筛选的还是核心竞争力,即掌握的技术和拥有的水平越强越有用,工作机会和薪资自...

架构师小秘圈 1241
上一篇: Java-基于Spring Cloud Netflix的TCC柔性事务和EDA事件驱动示例
下一篇: Java高级架构师-分布式Redis深度历险-复制
程序员杨过
博客等级 码龄7年 13粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值