Java 基础 - 06 List 之 Stack 以及List的相关总结

Java的栈,算是我们在Java中常见的一种数据结构,他遵循先进后出的原则(Last-In-First-Out,LIFO)的原则,在Java中,Stack是通过继承自Vector类实现的。

在这里插入图片描述
如上图所示,我们的stack继承自Vector。

我们来看一个简单的案例,实现一个简单的先进后出demo:

 public static void main(String[] args) {
        // 创建一个Stack对象
        Stack<String> stack = new Stack<>();

        // 入栈操作
        stack.push("Java");
        stack.push("Python");
        stack.push("C++");

        // 出栈操作
        while (!stack.isEmpty()) {
            String element = stack.pop();
            System.out.println("出栈元素: " + element);
        }
    }

在这里插入图片描述
由于Stack继承自Vector,故而Stack中并没有许多新的方法,一般主要操作栈就是在Stack中进栈和出栈,当然还可以判断栈是否为空,以及在栈中搜索相关元素。这个栈里边很多方法来自Vector,直接使用就行,值得注意的是,在Stack中,Java通过五个操作对Vector进行相关拓展,他允许将向量视为堆栈。Stack是Vector的增强类,堆栈顶部对应向量末尾。

在这里插入图片描述

boolean empty():测试堆栈是否为空。

public boolean empty() {
	return size() == 0;
}

peek() :查看堆栈顶部的对象,但不从堆栈中移除它。

public synchronized E peek() {
	//获取向量容量大小
	int	len = size();
	if (len == 0)
	    throw new EmptyStackException();
	return elementAt(len - 1);//调用父类Vector的elementAt方法
}

注意堆栈顶部的对象的对象索引对应的是向量末尾。

E pop(): 移除堆栈顶部的对象,并作为此函数的值返回该对象。

public synchronized E pop() {
	E	obj;
	//获取向量大小
	int	len = size();
	//获取堆栈顶部的对象
	obj = peek();
	//调用父类Vector的removeElementAt方法,移除末尾元素
	removeElementAt(len - 1);
	return obj;
}

E push(E item):把项压入堆栈顶部。

public E push(E item) {
	//调用父类Vector的addElement方法,添加元素至向量末尾
	addElement(item);
	return item;
}

int search(Object o):返回对象在堆栈中的位置,以 1 为基数。

public synchronized int search(Object o) {
	//调用父类Vector的lastIndexOf方法
	//返回此向量中最后一次出现的指定元素的索引,从末尾向前搜索,如果未找到该元素,则返回 -1。
	int i = lastIndexOf(o);
	if (i >= 0) {
	    return size() - i;
	}
	return -1;
}

List集合总结

ArrayList

  • 默认初始值容量为10,数组大小可变;
  • 是一个有序的,可以重复的, 允许为NULL值的
  • 是一个非同步的,快速失败机制
  • 底层是以transient Object[] 形式存储的,适用于快速随机访问元素。
  • 每次扩容在原有的基础上扩充 = 原有容量 * 1.5 + 1
  • 扩容增量 > 实际添加的元素数,保证不需要每次添加元素的时候都进行库容,从而提高性能。
  • iterator()调用的是父类的AbstractList方法
  • 数组大小理论上是由Max值构成,index的类型为int。

fail-fast(快速失败机制)就是在做系统设计的时候先考虑异常情况,一旦发生异常,直接停止并上报。

LinkedList

  • 是List接口的链表实现,支持序列化、有序、值可以为NULL。
  • 双向链表运行将链接列表作用于堆栈、队列或者双端队列。
  • 适用于随机快速插入和删除。
  • 也是非同步的,快速失败机制
  • 在条件满足的情况下,其内存可以无限大,链式存储
  • iterator()由其内部类ListItr实现。

CopyOnWriteArrayList

  • 用于读多写少的情况下的并发场景
  • 复制用法会存在导致内存占用过高的问题。
  • 保证数据的最终一致性,但无法保证数据的实时性
  • 其内部使用的锁是可重入的互斥锁ReentrantLock来保证数据同步。
  • 其使用了Volatile关键字修饰数组,从而保证了可见性、
  • 其是读写分离的。
  • 在调用相关方法的时候,addIfAbsent可以做到不添加重复的元素。
  • 在使用的过程中需要注意的点,采用CopyOnWriteArrayList,也是就COW设计,在扩容的时候,需要按需扩容,避免内存浪费。
  • iterator()由其内部类COWIterator实现。

Vector

  • 可以实现增长的对象数组,其默认初始容量为10;
  • 可以使用整数索引进行访问,根据我们的实际需要可以进行增大和缩小。
  • 通过synchronized修饰每个方法,保证同步性,快速失败机制。
  • iterator()调用的是父类AbstractList方法。
  • 扩容方案 =》 容量增量>0,则预期为:现有容量+容量增量,否则为:现有容量*2),计算后与要求的最小容量比较,取最大值。 保证不必每次add时都进行扩容,提高性能。

Stack

  • Stack是先进后出(LIFO)的对象堆栈,实际上继承自Vector。
  • 他是Vector的增强类,堆栈顶部都对应向量尾部。
  • 在首次创建栈的时候,不包含项。
  • 特点是只能在栈顶进行插入和删除操作,即先进后出。
  • 不建议直接使用Stack类:在Java中,Stack类是通过继承自Vector类来实现的,而Vector类是一个线程安全的动态数组。由于Stack类继承了Vector类的所有方法,包括一些不安全的方法,因此在实际使用中,建议使用更为常见的LinkedList类来实现栈,或者使用Deque接口的实现类,如ArrayDeque。
  • 在使用栈时,需要注意空栈检查,避免栈溢出,不支持随机访问,以及选择合适的实现方式等。
  • 栈有一个固定的容量,当栈中的元素数量超过容量时,会导致栈溢出(StackOverflowError)。因此,在使用栈时,应该注意控制入栈的数量,避免溢出。
  • 不支持随机访问:栈是一种顺序访问的数据结构,只能从栈顶进行入栈和出栈操作。它不支持随机访问,即不能直接访问栈中的任意位置的元素。
  • 适用场景:栈适用于需要先进后出的场景,比如函数调用、表达式求值、括号匹配等。在这些场景下,栈可以提供便捷的操作和管理。

由于ArrayList是数组存储形式,在随机查询方面会比较快。若每次add或remove时均在末尾,ArrayList会比较快,直接通过index操作。但若随机add或remove,LinkedList链式存储,相比ArrayList少了System.arrayCopy操作,会快一点,且ArrayList每次随机添加和删除都需要移动元素,故而也会影响相关性能。Vector每个方法都加上synchronized,保证了同步同时,牺牲了性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-table右固定最后一列显示不全或者是倒数第二列无边框线

问题图片&#xff1a; 解决方式1&#xff1a; >>>.el-table__row td:not(.is-hidden):last-child { border-left:1px solid #EBEEF5; } >>>.el-table__header th:not(.is-hidden):last-child{ border-left:1px solid #EBEEF5; } >>>.el-table__head…

苹果传拟移除Apple Watch血氧侦测功能 | 百能云芯

近日传来消息&#xff0c;苹果公司正考虑对部分型号的Apple Watch进行调整&#xff0c;可能会移除血氧侦测功能&#xff0c;以规避美国国际贸易委员会&#xff08;ITC&#xff09;在去年10月做出的禁售令决定。这一决定的背后是因为两款苹果智能手表&#xff0c;即Apple Watch …

Idea变量前面自动加final取消

本方式适用于点击 CtrlAltV获取方法返回值时&#xff0c;自动在变量前面加final 的情况。 每次都会生成final&#xff0c;删了自己挺麻烦&#xff0c;在网上搜了几个办法也不行。后来无意中看到下面这个。 通过AltShiftO调出弹出菜单 发现Declare final默认是选中&#xff0c;取…

【华为 ICT HCIA eNSP 习题汇总】——题目集1

1、&#xff08;多选&#xff09;根据下面所示的命令输出&#xff0c;下列描述中正确的是&#xff1f; A、GigabitEthernet0/0/1 允许VLAN1通过 B、GigabitEthernet0/0/1 不允许VLAN1通过 C、如果要把 GigabitEthernet0/0/1 变为 Access 端口&#xff0c;首先 需要使用命令“un…

云卷云舒:2024数据库发展趋势预测-长图版

云计算和大数据时代对数据库提出了更高的要求&#xff0c;需要支持大规模数据存储和处理。 数据库需要具备分布式和并行计算能力&#xff0c;以满足高性能和可扩展性的需求。新型数据库技术如NewSQL和分布式数据库成为云计算和大数据时代的趋势。 注&#xff1a;本文为chatGPT配…

docker下载时报错 /usr/local/bin/docker-compose: 1: cannot open html: No such file

docker 下载时报错 /usr/local/bin/docker-compose: 1: cannot open html: No such file /usr/local/bin/docker-compose: 2: Syntax error: redirection unexpected&#xff0c; 在网上查找了一些解决方法都不对&#xff0c;最后&#xff0c;通过删除/usr/local/bin/docker-co…

一文教你使用 ChatGPT API function calling

一文教你使用 ChatGPT API function calling Function call如何理解Function call如何调用&#xff1f; Function call 如何理解Function call 函式呼叫(function calling) 可说是这次ChatGPT API 更新的杀手级更新。所谓函式呼叫&#xff0c;就是让你把外部函式的形状写入Cha…

win下安装tensorflow

1首先ctrlaltdelete打开任务管理器查看GPU型号 2或者右键我的电脑然后如下方式查看显卡发现没有navida没有GPU

Linux--部署 Tomcat 及其负载均衡

1.案例前置知识点 1&#xff09;Tomcat简介 名称由来&#xff1a;Tomcat最初是由 Sun的软件构架师詹姆斯邓肯戴维森开发的。后来他帮助将其变 为开源项目&#xff0c;并由Sun贡献给Apache软件基金会。由于大部分开源项目OReilly都会出一本相关的 书&#xff0c;并且将其封面设…

黑马程序员——javase基础——day02——运算符选择语句

目录&#xff1a; 运算符 算术运算符案例数值拆分操作的三种情况 数字相加(类型转换)字符相加字符串相加赋值运算符选择语句 顺序结构Debug的基本使用选择语句之if if语句格式1if语句格式2和格式3案例1(交通信号灯)关系运算符案例2(奇偶数)案例3(手机以旧换新)案例4(你是青年人…

探索2023年大模型与AIGC峰会:程序员的学习之旅与未来展望

在2023年的技术前沿&#xff0c;大模型与AIGC峰会无疑是一个备受瞩目的盛会。 作为程序员&#xff0c;你将从这次大会中学到什么&#xff1f;这次峰会将为你揭示哪些前沿科技趋势&#xff1f;让我们一起来探讨这个问题。 一、理解大模型与AIGC 大模型和AIGC是人工智能领域中两…

开源图床Lychee本地如何部署并结合内网穿透工具实现远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

NASA太空原子电池与Betavolt便携原子能电池对比分析

一、核心技术原理对比 1. Betavolt BV100原子能电池 工作原理&#xff1a;Betavolt BV100采用镍-63同位素作为能量源&#xff0c;这种同位素在衰变过程中释放β粒子&#xff08;高速电子流&#xff09;&#xff0c;并通过金刚石半导体材料捕获并转换为电能。不同于传统的热电转…

单调栈练习(五)— 子数组的最小值之和

题目 同样的LeetCode原题&#xff1a;题目链接 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff0c;因此 返回答案模 10^9 7 。 思路 暴力解 先来说暴力解的思路…

别再给自己的创业失败找借口了,什么都有你还创什么业?2024普通人如何创业,2024适合普通人的创业项目

说起创业&#xff0c;大家都是满腹牢骚&#xff0c;抱怨现在阶层固化&#xff0c;没有机会&#xff0c;自己也没有钱&#xff0c;没有资源。反正就是给自己创业失败找借口。 但是马云曾经表示&#xff0c;钱是最容易得到的东西&#xff0c;如果自己一开始就有钱&#xff0c;那…

C++特殊类设计类型转换

一、特殊类设计 在普通类的设计基础上&#xff0c;提出一些限制条件设计的类就是特殊类。 1、请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c; 只需让该类不能调…

Codeforces Round 919 (Div. 2) A~E

A. Satisfying Constraints(模拟) 题意&#xff1a; 给出 n n n个限制条件&#xff0c;问有多少个数字 k k k同时满足这些限制条件。 限制条件分为以下三种&#xff1a; k k k必须大于等于给出的一些数字 x x x k k k必须小于等于给出的一些数字 x x x k k k不能与给出的…

Go新项目-为何选Gin框架?(0)

先说结论&#xff1a;我们选型Gin框架 早在大概在2019年下旬&#xff0c;由于内部一个多线程上传的需求&#xff0c;考虑到Go协程的优势&#xff1b; 内部采用Gin框架编写了内部的数据上传平台BAP&#xff0c;采用GinVue开发&#xff0c;但前期没考虑到工程化思维&#xff0c;导…

【linux】终端发送网络请求与文件下载

发送网络请求 linux的终端中发送网络请求可以使用curl命令。 语法&#xff1a; curl [url] 但是他返回的是html代码&#xff0c;因为在终端中&#xff0c;他无法像浏览器中一样把访问到的html代码渲染成我们访问的页面&#xff0c;所以我们只能拿到他的源码。 访问CSDN - 专…

线性表的应用 | 线性表的合并

线性表的合并 #include <iostream> using namespace std;#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2typedef int Status;// 定义单链表 typedef struct LNode {int data;struct LNode *next; }LNode, *…