使用LinkedList实现堆栈及Set集合特点、遍历方式、常见实现类

news/发布时间2024/5/15 13:33:36

目录

一、使用LinkedList实现堆栈

堆栈

LinkedList实现堆栈 

二、集合框架

三、Set集合

1.特点

2.遍历方式

3.常见实现类

HashSet

LinkedHashSet

TreeSet


一、使用LinkedList实现堆栈

堆栈

堆栈(stack)是一种常见的数据结构,一端被称为栈顶,另一端被称为栈底,它遵循"先进后出"(Last In First Out,LIFO)的原则。在堆栈中,最后放入堆栈的元素将首先被移除。

堆栈具有两个主要的操作:

  1. 入栈(push):将元素添加到堆栈顶部。
  2. 出栈(pop):从堆栈顶部移除元素并返回它。

除了这两个主要操作外,堆栈还可能支持其他常用操作,例如:

  • 获取栈顶元素(top):查看位于堆栈顶部的元素,而不移除它。
  • 判断堆栈是否为空(isEmpty):检查堆栈是否不包含任何元素。

在Java中,可以使用数组或链表来实现堆栈。常见的实现方式包括使用Java的自带栈类(Stack类或Deque接口的实现类),或者使用LinkedList类来自行实现堆栈。

堆栈在编程中有许多实际应用,例如算术表达式求值、函数调用栈、撤销/重做操作等等。

LinkedList实现堆栈 

要使用LinkedList来实现堆栈(stack),你可以按照以下步骤进行操作:

  1. 导入LinkedList类:在Java中,LinkedList类位于java.util包中,因此你需要在代码中导入该类
    import java.util.LinkedList;
  2. 创建堆栈类:创建一个名为Stack的类,该类将包含两个方法:push(入栈)和pop(出栈)
    public class Stack {private LinkedList<Object> list;public Stack() {list = new LinkedList<Object>();}public void push(Object element) {list.addFirst(element);}public Object pop() {return list.removeFirst();}
    }
  3. 使用堆栈:现在你可以在代码中实例化Stack类,并使用push(入栈)和pop(出栈)方法来操作堆栈
    public class Main {public static void main(String[] args) {Stack stack = new Stack();stack.push("A");stack.push("B");stack.push("C");System.out.println(stack.pop()); // 输出 "C"System.out.println(stack.pop()); // 输出 "B"System.out.println(stack.pop()); // 输出 "A"}
    }

二、集合框架

三、Set集合

Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。是一种数据结构,它是由一组唯一元素组成的集合,这意味着其中不会有重复的元素。在编程中,Set集合通常用来存储不重复的数据,可以对其中的元素进行添加、删除和查找操作。

1.特点

  • 无序:Set集合数据添加的顺序和取出的顺序不一致

    Set<Integer> set=new HashSet<Integer>();
    set.add(2);
    set.add(1);
    set.add(5);
    set.add(8);
    System.out.println(set);
  • 唯一:List集合数据允许添加重复数据

    Set<Integer> set=new HashSet<Integer>();
    set.add(2);
    set.add(1);
    set.add(5);
    set.add(8);
    set.add(8);
    System.out.println(set);
  • 问题:存储对象,验证Set集合唯一性

    Set<User> set=new HashSet<User>();
    set.add(new User(1,"zs"));
    set.add(new User(2,"ls"));
    set.add(new User(1,"zs"));
    for (User user : set) {System.out.println(user);
    }

    查看结果:存储相同属性的User对象时,Set集合并未满足唯一性要求,打印输入了相同对象信息。 输出格式:类的全路径名+@+十六进制内存地址

    User user = new User();
    user.equals(null);  //跳转到equals方法查看源码

    问题原因:判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现;而在没有重写equals方法之前默认比较的是Object(引用类型),实际上比较的是内存地址。

重写User对象中的equals方法,比较User对象中的属性。  

@Override
public int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());return result;
}
@Override
public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;
}

 当比较对象的属性相同时,已存在的对象信息不会被覆盖,而是过滤了。 结论:先比较hashcode值是否相同,再比较equals;

2.遍历方式

  • foreach

    Set<String> set=new HashSet<String>();
    set.add("zs");
    set.add("ls");
    set.add("ww");
    for (String value : set) {System.out.println(value);
    }
  • 迭代器

    Set<String> set=new HashSet<String>();
    set.add("zs");
    set.add("ls");
    set.add("ww");
    Iterator<String> it = set.iterator();
    while(it.hasNext())System.out.println(it.next());

3.常见实现类

HashSet

  • 它不允许出现重复元素;

  • 不保证集合中元素的顺序

  • 允许包含值为null的元素,但最多只能有一个null元素。

  • HashSet的实现是不同步的。

LinkedHashSet

  • 哈希表和链表实现Set接口,具有可预测的迭代次序;

  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的。

  • 由哈希值保证元素唯一,也就是说没有重复的元素

TreeSet

TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。

  • java.lang.Comparable自然比较接口

    public class User implements Comparable<User> {private int id;private String name;...@Overridepublic int compareTo(Student b) {return this.id-b.id;}
    }
  • java.util.Comparator比较器

    public class NameComparator implements Comparator<User> {@Overridepublic int compare(User a, User b) {return a.getName()-b.getName();}
    }

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

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

抖音爬虫批量视频提取功能介绍|抖音评论提取工具

抖音爬虫是指通过编程技术从抖音平台上获取视频数据的程序。在进行抖音爬虫时&#xff0c;需要注意遵守相关法律法规和平台规定&#xff0c;以确保数据的合法获取和使用。 一般来说&#xff0c;抖音爬虫可以实现以下功能之一&#xff1a;批量视频提取。这个功能可以用于自动化地…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

WebRTC最新版报错解决:FileNotFoundError: LASTCHANGE.committime (二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

SpringCloud-Gateway解决跨域问题

Spring Cloud Gateway是一个基于Spring Framework的微服务网关&#xff0c;用于构建可扩展的分布式系统。在处理跨域问题时&#xff0c;可以通过配置网关来实现跨域资源共享&#xff08;CORS&#xff09;。要解决跨域问题&#xff0c;首先需要在网关的配置文件中添加相关的跨域…

智慧建工的魔法:数据可视化的引领之光

在智慧建工的时代&#xff0c;数据可视化成为推动建筑行业进步的强大引擎&#xff0c;其作用不可忽视。通过将复杂的建筑数据以直观、清晰的图形展示出来&#xff0c;数据可视化为建筑工程提供了前所未有的便利和创新。 首先&#xff0c;数据可视化在建筑规划和设计阶段发挥关键…

Windows安装ElasticSearch

安装ES 官方网站&#xff1a;https://www.elastic.co/cn/elasticsearch 声明&#xff1a;JDK1.8 &#xff0c;最低要求&#xff01; Java开发&#xff0c;ElasticSearch的版本和我们之后的java核心包对应 windows安装 目录结构 目录熟悉 bin 启动文件 config 配置文件log4j…

数据结构-Queue队列

一,队列的简单认识 队列也是一种线性数据结构,与栈不同的是,它只能从一端添加元素,从另一端取出元素.定义了一端,另一端也就确定了. (当然还有一个特殊的双向队列LinkedList除外,它既可以从队首添加元素,也可以移除元素,队尾也是一样的,既可以添加元素,也可以移除元素) 二,队…

算法打卡day1|数组篇|Leetcode 704.二分查找、27.移除元素

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合&#xff0c;可以方便的通过下标索引的方式获取到下标下对应的数据。 1.数组下标都是从0开始的。 2.数组内存空间的地址是连续的。 正是因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添…

如何连接ACL认证的Redis

点击上方蓝字关注我 应用程序连接开启了ACL认证的Redis时与原先的方式有差别&#xff0c;本文介绍几种连接开启ACL认证的Redis的Redis的方法。 对于RedisACL认证相关内容&#xff0c;可以参考历史文章&#xff1a; Redis权限管理体系(一&#xff09;&#xff1a;客户端名及用户…

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作&#xff1a; 部署 TiDB 前的环境检查操作&#xff1a;TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l &#xff08;2,3&#xff09;本人的分区已经是 ext4 文件系统不用分区&#xff0c;具体官方文档的分区&#xff1a; 4.查看数据盘…

小程序画布(二维地图线)

首先开始是想用小程序兼容openlayers的&#xff0c;但是了解到用不了&#xff0c;那就用画布来解决 实际效果如下 wxml中代码 <canvas id"trackDesignCanvas" //指定 id 的 Canvas 组件class"orbit-canvas-main" type"2d" …

鸿蒙DevEco Service开发准备与使用

DevEco低代码是一个基于Serverless和ArkUI的端云一体化低代码开发平台&#xff0c;可通过拖拽式开发&#xff0c;可视化配置构建元服务。打通HarmonyOS云侧与端侧能力&#xff0c;轻松实现HMS Core和AGC Serverless能力的调用。通过与元服务生态、HMS Core、AGC Serverless平台…

如何用GPT高效地处理文本、文献查阅、PPT编辑、编程、绘图和论文写作?

原文链接&#xff1a;如何用GPT高效地处理文本、文献查阅、PPT编辑、编程、绘图和论文写作?https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247594986&idx4&sn970f9ba75998f2dd9fa5707d1611a6cc&chksmfa82320dcdf5bb1bdf58c20686d4eb209770e68253ed90d…

opengl 学习纹理

一.纹理是什么&#xff1f; 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来添加物体的细节&#xff1b;类似于图像一样&#xff0c;纹理也可以被用来储存大量的数据&#xff0c;这些数据可以发送到着色器上。 采样是指用纹理坐标来获取纹…

【数据结构】链式队列

链式队列实现&#xff1a; 1.创建一个空队列 2.尾插法入队 3.头删法出队 4.遍历队列 一、main函数 #include <stdio.h> #include "./3.linkqueue.h" int main(int…

7.(数据结构)堆

7.1 相关概念 堆&#xff08;Heap&#xff09;在计算机科学中是一种特殊的数据结构&#xff0c;它通常被实现为一个可以看作完全二叉树的数组对象。以下是一些关于堆的基本概念&#xff1a; 数据结构&#xff1a; 堆是一个优先队列的抽象数据类型实现&#xff0c;通过完全二叉树…

微服务三十五关

1.微服务有什么好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东西好肯定会跟另一个东西比较&#xff0c; 通常说微服务好会和单体项目进行比较。以下是微服务相对于单体项目的一些显著好处&#xff1a; 首先&#xff0c;让我们讨论单体项目的一些主要缺点&a…

Spring6学习技术|Junit

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; Junit 背景 背景就是每次Test都要重复创建容器&#xff0c;获取对象。就是ApplicationContext和getBean两个语句。通过Spring整合Junit&#xff0c;可以…

Unity NavMesh 清除不可行走区域

通常场景中物体设置为static或Navigation Static后&#xff0c;打开Navigation使用默认设置烘焙NavMesh&#xff0c;模型顶部和底部会出现蓝色网格&#xff0c;但其中有部分属于不可能到达区域&#xff0c;如下图 本文介绍两种可去掉NavMesh中不需要网格的方法&#xff1a; 方…

【Java网络编程06】HTTPS原理

1. HTTPS基本概念 HTTPS&#xff1a;HTTPS也是一个应用层协议&#xff0c;它在HTTP协议的基础上引入了一个加密层——SSL协议&#xff0c;区别就在于HTTP协议是基于明文传输的&#xff08;不安全&#xff09;&#xff0c;使用HTTPS加密就能在一定程度上防止数据在传输过程中被…
推荐文章