Java语言程序设计——篇十一(2)

news2024/11/15 4:22:40

在这里插入图片描述
在这里插入图片描述

       🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

🚩集合——List

  • 集合框架
  • List接口及实现类
    • List的操作
    • ArrayList类
      • 实战演练
    • 遍历集合元素
      • 实战演练
    • 数组转换为List对象
        • 综合实例

集合框架

  • 集合框架是Java以类库的形式提供了用户开发程序时可直接使用的各种数据结构
  • 数据结构:以某种形式将数据组织在一起,不仅支持存储数据,还支持访问和处理数据。
  • 在面向对象思想里,一种数据结构被认为是一个容器(集合)。
  • Java集合框架提供了一些现成的数据结构可供使用,这些数据结构是可以存储对象的集合,在这里对象也称为元素。
  • Java集合框架由两种类型构成:
        1️⃣Collection,用于存放一组对象。
        2️⃣Map ,用于存放一组“关键字/值”的对象。
    在这里插入图片描述
  1. 基本操作
    boolean add(E e):向集合中添加元素e
    boolean remove(Object o):从集合中删除指定的元素o
    boolean contains(Object o):返回集合中是否包含指定元素
    boolean isEmpty():判空
    int size():返回集合中所包含元素的个数
    Iterator iterator():返回包含所有元素的迭代器对象
  2. 批量操作
    boolean addAll(Collection<? extends E> c) 功能:将集合c中的所有元素添加到当前集合中 boolean removeAll(Collection<?> c)
    功能:从当前集合中删除集合c中的所有元素
    default boolean removeIf(Predicate<? super E> filter)
    功能:从当前集合中删除满足谓词的所有元素
  3. 数组操作
    Object[] toArray() :用来返回包含集合中所有元素的Object型数组
    eg: Object[] a = c.toArray();
    T[] toArray(T[] a):用来返回包含集合中所有元素的指定类型的数组
    eg: String[] a = c.toArray(new String[0]);
  4. 流(Stream)操作
    default Stream stream()
    功能:以当前集合作为源返回一个顺序Stream对象
    default Stream parallelStream()
    功能:以当前集合作为源返回一个并行Stream对象

List接口及实现类

  • 列表接口List是Collection的子接口,它是一种包含有序元素的线性表,其中的元素可重复,也可以是空值null。
  • 存放在List中的元素有一个下标(从0开始),可通过下标访问List中的元素。
  • 在这里插入图片描述

在这里插入图片描述

List的操作

  • 因为List接口为Collection的子接口,所以List接口拥有Collection接口提供的所有常用方法。
  • List是列表类型,它还提供了一些适合于自身的常用方法,如下页表所示。
方 法 名 称功 能 简 介
void add(int index, E obj)用来向列表的指定索引位置添加对象,其他对象的索引位置相对后移一位。索引位置从0开始
E remove(int index)用来清除列表中指定索引位置的对象
E set(int index, E obj)用来将列表中指定索引位置的对象修改为指定的对象
E get(int index)用来获得指定索引位置的对象
int indexOf(Object obj)用来获得指定对象的第一个索引位置。当不存在时,返回-1
int lastIndexOf(Object obj)用来获得指定对象的最后一个索引位置。当不存在时,返回-1
List <?> subList(int from, int to)返回从from(包含)到to(不包含)的一个List列表
listIterator()用来获得一个包含所有对象的ListIterator型实例

ArrayList类

  • List接口的常用实现类有ArrayList和LinkedList,在使用线性表时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList。
  • 例如:
// 利用ArrayList类实例化List
List<String> list1 = new ArrayList<String>();  
// 利用LinkedList类实例化List
List<String> list2 = new LinkedList<String>(); 
  • ArrayList类是通过数组实现的集合对象,它实际上实现了一个变长的对象数组,元素可以动态的增加和删除。
  • 数组结构的优点是便于对列表进行快速的随机访问, 如果经常需要根据索引位置访问集合中的对象,使用ArrayList类实现的列表的效率较高。
  • 数组结构的缺点是向指定索引位置插入对象、删除指定索引位置对象的速度较慢。
  • 当在指定索引位置插入对象时,会将指定索引位置及其后的所有元素相应地向后移动一位,如下图所示:
    在这里插入图片描述
  • 删除指定索引位置的对象时,会将指定索引位置之后的所有元素相应地向前移动一位,如下图所示: 在这里插入图片描述
  • 进行插入、删除操作时,如果在指定的索引位置之后有大量的对象,将严重影响对集合的操作效率。
  • ArrayList类的构造方法
public ArrayList():创建初始容量为10的空数组列表
public ArrayList(int i):创建初始容量为i的空数组列表
public ArrayList(Collection c):创建包含容器c中所有元素的数组列表

实战演练

例:TestArrayList.java

import java.util.ArrayList;
public class TestArrayList {
public static void main(String[] args) {
   ArrayList<String> cityList = new ArrayList<>();
   //add some cities in the list
   cityList.add("Beijing");
   //cityList now contains[Beijing]
   cityList.add("London");
   //cityList now contains[Beijing,London]
   cityList.add("Shanghai");
   //cityList now contains[Beijing,London,Shanghai]
   cityList.add(" Beijing");
   //cityList now contains[Beijing,London,Shanghai, Beijing]
   cityList.add("Taiyuan");
   //cityList now contains[Beijing,London,Shanghai, Beijing,Taiyuan]
   System.out.println("List size="+cityList.size());
   System.out.println("Is Taiyuan in the list?"+cityList.contains("Taiyuan"));
   System.out.println("The location of Shanghai in the list?"+cityList.indexOf("Shanghai"));
   System.out.println("Is the list empty?"+cityList.isEmpty());
   cityList.add(2, "Xian");  // [Beijing,London,Xian,Shanghai, Beijing,Taiyuan]
   cityList.remove(Shanghai"); // [Beijing,London,Xian,Beijing,Taiyuan]
   cityList.remove(1); // [Beijing,Xian,Beijing,Taiyuan]
   System.out.println(cityList.toString());  
   for(int i=cityList.size()-1;i>=0;i--)
	System.out.print(cityList.get(i)+" ");
   }
}

在这里插入图片描述

遍历集合元素

  • 对集合中元素访问时,经常需要按某种次序对每一个元素访问且仅访问一次,这就是遍历,也称迭代。
  • 对集合元素遍历有如下4种方式:
    a.简单的for循环
   for(int i=0; i<array.size(); i++) String o = array.get(i);

b.增强的for循环

    for(String elm:array)  System.out.println(elm)

c.Iterator迭代器对象
d.ListIterator迭代器对象

c.Iterator迭代器对象

  • 每个实现Collection接口的容器对象都可调用iterator()方法返回一个Iterator对象,称为迭代器对象。
  • 接口Iterator支持对List对象的从前向后的遍历,该接口定义了3个方法。
  • 1)boolean hasNext():返回迭代器是否有下一个元素
    2)E next(): 返回下一个元素
    3)void remove():删除迭代器中的当前元素
Iterator iterator = array.iterator(); //得到迭代器对象
while(iterator.hasNext())
      System.out.println(iterator.next());

               在这里插入图片描述

for(Iterator iterator = array.iterator(); iterator.hasNext();)
      System.out.println(iterator.next());

d.ListIterator迭代器对象

  • 通过List接口提供的listIterator()方法可以返回ListIterator对象,它支持对线性表双向遍历。
  • ListIterator是Iterator的子接口,不但继承了Iterator接口中的方法,还定义了多个方法。
boolean hasNext() :返回是否还有下一个元素
boolean hasPrevious() :返回是否还有前一个元素
E next():返回下一个元素
E previous():返回前一个元素
int nextIndex():返回下一个元素的索引
int previousIndex():返回前一个元素的索引
void add(E o):当前位置插入一个元素
void remove():删除当前元素
void set(E o):修改当前元素

实战演练

例:使用ListIterator对象实现反向输出线性表中的元素。

import java.util.*;
public class IteratorDemo{
    public static void main(String[] args) {
         List<String> myList = new ArrayList<String>();
     myList.add("one");
     myList.add("two");
     myList.add("three");
     myList.add("four");
     ListIterator<String> iterator = myList.listIterator();
      // 将迭代器指针移动到线性表末尾
     while(iterator.hasNext()){
                   iterator.next();
              }
              // 从后向前访问线性表的每个元素
              while (iterator.hasPrevious())
                   System.out.println(iterator.previous());
     }
}

在这里插入图片描述

数组转换为List对象

  • java.util.Arrays类提供了一个asList()方法,它将数组转换成List对象,定义如下:
public static <T> List<T> asList(T… a)参数可以为数组,可以是数组元素
String[] str = {"one", "two", "three"};
List<String> list = Arrays.asList(str);
List<String> list = Arrays.asList("one", "two", "three");
  • Arrays.asList()方法返回的List对象不可变。若要对该List对象进行添加、删除等操作,可以将其作为参数传递给另一个List的构造方法。
List<String> list1 = new ArrayList<>(list);
综合实例

编写程序,实现一个对象栈类MyStack,要求使用ArrayList类实现该栈,该栈类的UML图如下所示。
在这里插入图片描述

import java.util.ArrayList;  
import java.util.List;  
  
public class MyStack<T> {  
    private List<T> list;  
  
    // 构造函数  
    public MyStack() {  
        list = new ArrayList<>();  
    }  
  
    // 判断栈是否为空  
    public boolean isEmpty() {  
        return list.isEmpty();  
    }  
  
    // 返回栈的大小  
    public int getSize() {  
        return list.size();  
    }  
  
    // 返回栈顶元素但不移除  
    public T peek() {  
        if (isEmpty()) {  
            throw new IllegalStateException("Stack is empty");  
        }  
        return list.get(list.size() - 1);  
    }  
  
    // 弹出栈顶元素  
    public T pop() {  
        if (isEmpty()) {  
            throw new IllegalStateException("Stack is empty");  
        }  
        return list.remove(list.size() - 1);  
    }  
  
    // 元素入栈  
    public void push(T t) {  
        list.add(t);  
    }  
  
    // 元素查找方法,返回元素在栈中的位置(从栈底开始计数,即第一个元素位置为0),如果未找到则返回-1  
    public int search(T t) {  
        for (int i = 0; i < list.size(); i++) {  
            if (list.get(i).equals(t)) {  
                return i; // 注意这里返回的是从栈底开始的位置  
            }  
        }  
        return -1; // 未找到  
    }  
  
    // 可选:打印栈内容(用于调试)  
    public void printStack() {  
        System.out.println("Stack content (bottom to top):");  
        for (int i = 0; i < list.size(); i++) {  
            System.out.println(list.get(i));  
        }  
    }  
  
    // 主函数,用于测试MyStack类  
    public static void main(String[] args) {  
        MyStack<Integer> stack = new MyStack<>();  
        stack.push(1);  
        stack.push(2);  
        stack.push(3);  
  
        System.out.println("Stack size: " + stack.getSize());  
        System.out.println("Top element: " + stack.peek());  
        System.out.println("Popped element: " + stack.pop());  
        System.out.println("Element 2 position: " + stack.search(2));  
  
        stack.printStack();  
    }  
}

博主用心写,读者点关注,互动传真情,知识不迷路。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法导论 总结索引 | 第五部分 第二十一章:用于不相交集合的数据结构

一些应用涉及 将n个不同的元素分成一组不相交的集合。寻找包含给定元素的唯一集合 和 合并两个集合 1、不相交集合的操作 1、一个不相交集合 数据结构 维持了 一个不相交动态集的集合 S {S_1, S_2,…, S_n}。用一个代表 来标识每个集合&#xff0c;它是这个集合的某个成员。…

IoTDB 入门教程 企业篇④——安全控制 | 白名单、审计日志、登录日志和操作日志

文章目录 一、前文二、白名单2.1 配置文件iotdb-common.properties2.2 配置文件white.list2.3 注意事项 三、审计日志3.1 Cli操作日志3.2 RESTful操作日志3.3 MQTT操作日志3.4 Java操作日志3.5 C#操作日志3.6 Python操作日志 四、参考 一、前文 IoTDB入门教程——导读 IoTDB企业…

C语言9~10 DAY(合集)

数组的概念 什么是数组 数组是相同类型&#xff0c;有序数据的集合。 数组的特征 数组中的数据被称为数组的元素&#xff0c;是同构的 数组中的元素存放在内存空间里 (char player_name[6]&#xff1a;申请在内存中开辟6块连续的基于char类型的变量空间) 衍生概念&#x…

力扣高频SQL 50题(基础版)第三十七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十七题176.第二高的薪水题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十七题 176.第二高的薪水 题目说明 Employee 表&#xff1a; ----------------- …

【传知代码】基于标签相关性的多标签学习(论文复现)

在当今信息爆炸的时代&#xff0c;数据中包含的标签信息对于理解和分析复杂问题至关重要。在诸如文本分类、图像识别和推荐系统等应用中&#xff0c;如何有效地利用标签相关性提升多标签学习的效果成为了研究的热点之一。基于标签相关性的多标签学习方法&#xff0c;通过挖掘不…

存储届的奥运竞技 | 400层3D NAND最快2025到来~

随着内存巨头之间的高带宽内存 (HBM) 竞争日益激烈&#xff0c;NAND 存储器领域的竞争也在升温。据韩国媒体《etnews》报道&#xff0c;SK 海力士正在研发 400 层 NAND 闪存技术&#xff0c;计划在 2025 年底前准备好这项技术以实现量产。 报道称&#xff0c;SK 海力士目前正在…

AcWing并查集

建议先看这个 Bilibili------------------>图论——并查集(详细版) 其实M 1 2就是把1的祖先改成了2&#xff0c;然后M 3 4就是把3的祖先改成了4&#xff0c;然后查询这两数1,2的祖先是不是同一个&#xff0c;3,4的祖先是不是同一个&#xff0c;1&#xff0c;3的祖先是不是同…

【期货】收盘点评。昨天说的,p2409棕榈油在今天或者周一会走出行情

收盘点评 昨天说的&#xff0c;p2409棕榈油在今天或者周一会走出行情。事实就是如此。震荡了几天了&#xff0c;波幅不大的来回震荡&#xff0c;其实主力是不想震荡的&#xff0c;但是不震荡自己的货和行情走不出来。所以我昨天就说&#xff0c;应该就是这一两天会走出一波小行…

⑤【从0制作自己的ros导航小车:上、下位机通信篇】上、下位机串口DMA通信

从0制作自己的ros导航小车 前言一、准备工作二、下位机端&#xff08;STM32&#xff09;三、上位机端&#xff08;旭日x3派&#xff09;四、测试 系列文章&#xff1a; ①【从0制作自己的ros导航小车&#xff1a;介绍及准备】 ②【从0制作自己的ros导航小车&#xff1a;下位机篇…

一站式解决方案:打造无缝连接的跨渠道客户服务体验

在当今这个数字化时代&#xff0c;客户与企业之间的互动已不再局限于单一渠道。从社交媒体、在线聊天、电子邮件到电话热线&#xff0c;甚至是实体店面&#xff0c;客户期望能够随时随地、无缝切换地获得一致且高效的服务体验。因此&#xff0c;构建一站式解决方案&#xff0c;…

商城系统审计代码审计

1 开源组件通用性漏洞审计 1.1 fastjson漏洞审计与验证 1.1.1 相关知识 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java对 象之间相互转换。 Fastjson反序列化漏洞简单来说是出现在将JSON数据反序列化过程中出现的漏洞。 攻击者可以传入一个恶…

算法小白的进阶之路(力扣6~8)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

对象属性值对比(支持复杂对象)

文章目录 前言一、如何对比二、开始编码三、使用结果示例总结 前言 需求如下&#xff1a; 对比两个bean中的内容,返回其中属性的值不一致的完整信息,包括: 属性 新值 旧值 一、如何对比 例如我有一个这的类型: public class Tel {private String name;private String tel; …

学习笔记第十七天

1.链表 1.1链表尾插 void push_back(struct Node *pHead,int n)//尾插 {if(isEmpty(pHead)){push_front(pHead,n);}else{struct Node *p pHead->next; while(p->next !NULL){p p->next;}struct Node *pNew malloc(sizeof(struct Node));p->nextpNew;pNew->n…

C++ bind复杂回调逻辑分析

回调函数基本知识回顾 回调函数是什么 函数指针或者函数对象作为参数传递给另一个函数的机制&#xff0c;当某个事件发生的时候&#xff0c;系统会自动的调用这些函数进行处理事件驱动模型中作用&#xff0c;回调函数则被用于处理I/O事件&#xff0c;通常用来读写异常等事件 bi…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备 ​ 大家好&#xff0c;因为板端BPU环境&#xff0c;可以加速目标检测的速度&#xff0c;所以今天在此先给大家带来如何准备一个模型&#xff0c;下一期会给大家带来如何在板端部…

如何做一个惊艳领导和客户的原型?

在产品开发过程中&#xff0c;原型设计是验证设计想法、提升用户体验的重要环节。Axure作为一款业界领先的原型设计工具&#xff0c;凭借其强大的交互设计和丰富的功能&#xff0c;赢得了全球设计师和开发者的信赖。而Axure的高效交互元件库&#xff0c;则如同一本字典或说明书…

将YOLOv8模型从PyTorch的.pt格式转换为OpenVINO支持的IR格式

OpenVINO是Open Visual Inference & Neural Network Optimization工具包的缩写&#xff0c;是一个用于优化和部署AI推理模型的综合工具包。OpenVINO支持CPU、GPU和NPU设备。 OpenVINO的优势: (1).性能&#xff1a;OpenVINO利用英特尔CPU、集成和独立GPU以及FPGA的强大功能提…

原生IP节点是什么意思?和socks5节点有什么区别?

在了解这两种代理节点前&#xff0c;我们首先要了解&#xff1a;节点是什么&#xff1f; 首先&#xff0c;在电信网络当中&#xff0c;一个节点是一个连接点。表示一个再分发点又或者是一个通信端点。节点的定义依赖于所提及的网络和协议层。一个物理网络节点是一个连接到网络…

深度强化学习:穿越智能迷雾,探索AI新纪元

近年来&#xff0c;深度强化学习成为关注的热点。在自动驾驶、棋牌游戏、分子重排和机器人等领域&#xff0c;计算机程序能够通过强化学习&#xff0c;理解以前被视为超级困难的问题&#xff0c;取得了令人瞩目的成果。在围棋比赛中&#xff0c;AlphaGo接连战胜樊麾、李世石和柯…