Java中的Vector和Stack底层源码分析

 更新时间:2023年12月15日 08:53:10   作者:爱喝咖啡的程序员  
这篇文章主要介绍了Java中的Vector和Stack底层源码分析,Stack继承了Vector,Vector底层还是一个List,也就是基于数组来实现的,所以ArrayList有的优点,比如获取元素的速度快,随机读,它都有,需要的朋友可以参考下

一. 基本原理和优缺点

Stack继承了Vector,Vector底层还是一个List,也就是基于数组来实现的,所以ArrayList有的优点,比如获取元素的速度快,随机读,它都有,与此相对的,ArrayList的缺点,比如从中间插入一个元素,从中间删除一个元素,Stack也存在。

但是呢,Stack使用最多的方法就是push和pop,换句话说,Stack的作者并非希望我们把使用ArrayList的那一套,直接放到Stack上做。

如果严格按照push和pop来执行,就可以避免中间操作元素时,产生移动元素的后果了。当然了,频繁向Stack push元素,仍然可能导致扩容。

栈和队列(LinkedList)的实现有所不同,栈是"后进先出",而队列是"尾进头出"。

二. 源码分析

2.1 push

Stack底层与ArrayList非常相似,存储数据的容器是数组。

public E push(E item) {
	addElement(item);
	return item;
}
public synchronized void addElement(E obj) {
	modCount++;
	ensureCapacityHelper(elementCount + 1);
	elementData[elementCount++] = obj;
}
private void grow(int minCapacity) {
	// overflow-conscious code
	int oldCapacity = elementData.length;
	int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
									 capacityIncrement : oldCapacity);
	if (newCapacity - minCapacity < 0)
		newCapacity = minCapacity;
	if (newCapacity - MAX_ARRAY_SIZE > 0)
		newCapacity = hugeCapacity(minCapacity);
	elementData = Arrays.copyOf(elementData, newCapacity);
}

代码逻辑与ArrayList基本上一样。

首先,判断新增一个元素后,当前的容器能否放得下这么多数据,如果放不下,就要进行扩容。扩容无外乎就是在原有容器的基础上,扩大成1.5倍,如果还是放不下元素,则按照能够容纳新元素的最小大小,作为新容器的大小。只要涉及到扩容,肯定就会使用Arrays.copyOf()。

接着,就是往指定下标的位置,加入新元素。

2.2 pop

弹出栈顶元素。

public synchronized E pop() {
	E       obj;
	int     len = size();
	obj = peek();
	removeElementAt(len - 1);
	return obj;
}

所谓的栈顶元素,不就是当前数组中最后一个元素么,它的下标就是size-1,所以取出来就好啦。

三. 总结

Stack这个数据结构非常的简单,只要看过ArrayList的源码,再看Stack,2分钟就看完了。

使用栈时,用的最多的就是它"后进先出"的数据结构了。

到此这篇关于Java中的Vector和Stack底层源码分析的文章就介绍到这了,更多相关Vector和Stack底层源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java util concurrent及基本线程原理简介

    Java util concurrent及基本线程原理简介

    这篇文章主要介绍了Java util concurrent及基本线程原理简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 浅谈Mybatis传参类型如何确定

    浅谈Mybatis传参类型如何确定

    最近有小伙伴在讨论#{}与${}的区别时,有提到#{}是用字符串进行替换,本文主要介绍了mapper接口中不同的参数类型,最终拼接sql中是如何进行替换的,感兴趣的可以了解一下
    2021-10-10
  • Java实现异步延迟队列的方法详解

    Java实现异步延迟队列的方法详解

    目前系统中有很多需要用到延时处理的功能,本文就为大家介绍了Java实现异步延迟队列的方法,文中的示例代码讲解详细,需要的可以参考一下
    2023-03-03
  • java JTree JCheckBox树复选框详解

    java JTree JCheckBox树复选框详解

    这篇文章主要为大家详细介绍了java JTree JCheckBox树复选框的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • springboot配置https安全连接的方法

    springboot配置https安全连接的方法

    这篇文章主要介绍了springboot配置https安全连接的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • SpringBoot框架打包体积简化过程图解

    SpringBoot框架打包体积简化过程图解

    这篇文章主要介绍了SpringBoot框架打包体积简化过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • SpringCache缓存抽象之CacheManager与自定义键生成方式

    SpringCache缓存抽象之CacheManager与自定义键生成方式

    本文将深入探讨Spring Cache的核心组件CacheManager及自定义键生成策略,帮助开发者掌握缓存配置与优化技巧,从而构建高效可靠的缓存系统,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java基于代理模式解决红酒经销问题详解

    Java基于代理模式解决红酒经销问题详解

    这篇文章主要介绍了Java基于代理模式解决红酒经销问题,详细描述了代理模式的概念、原理并结合实例形式分析了java基于代理模式解决红酒经销问题的相关步骤、实现方法与操作注意事项,需要的朋友可以参考下
    2018-04-04
  • SpringBoot 自定义starter yaml提示失效问题及解决方法

    SpringBoot 自定义starter yaml提示失效问题及解决方法

    在自定义starter后,必不可少会有properties配置参数需要指定,而在有时又不知道为什么出现这个问题,这篇文章主要介绍了SpringBoot 自定义starter yaml提示失效问题,需要的朋友可以参考下
    2022-12-12
  • Java中如何利用Set判断List集合中是否有重复元素

    Java中如何利用Set判断List集合中是否有重复元素

    在开发工作中,我们有时需要去判断List集合中是否含有重复的元素,这时候我们不需要找出重复的元素,我们只需要返回一个 Boolean 类型就可以了,下面通过本文给大家介绍Java中利用Set判断List集合中是否有重复元素,需要的朋友可以参考下
    2023-05-05

最新评论