List集合之UML、特点、遍历方式、迭代器原理、泛型、装拆箱及ArrayList、LinkedList和Vector的区别

news2024/11/17 21:34:29

目录

​编辑

一、什么是UML

二、集合框架

三、List集合

1.特点

2.遍历方式

3.删除

4.优化

四、迭代器原理

五、泛型

六、装拆箱

七、ArrayList、LinkedList和Vector的区别

 ArrayList和Vector的区别

LinkedList和Vector的区别 


一、什么是UML

UML(Unified Modeling Language)是一种用于软件系统设计和建模的标准化语言。它提供了一种统一的方法来描述系统的结构和行为,以便于开发人员、设计师和其他利益相关者之间的沟通和理解。

UML包括多种图形符号,如用例图、类图、时序图、活动图等,每种图形符号都用于表示系统的不同方面和视图。通过使用这些图形符号,开发人员可以更好地理解系统的需求、结构和行为,从而更好地进行系统设计和开发。

  1. UML官方网站:Welcome To UML Web Site!
  2. UML教程:UML Tutorial

二、集合框架

三、List集合

1.特点

  • 有序:List集合数据存进去的顺序和取出来的顺序一致

    List lst=new ArrayList();
    lst.add(2);
    lst.add(1);
    lst.add(5);
    lst.add(8);
    System.out.println(lst);
  • 不唯一:List集合数据允许添加重复数据

    List lst=new ArrayList();
    lst.add(2);
    lst.add(1);
    lst.add(5);
    lst.add(8);
    lst.add(8);
    System.out.println(lst);

2.遍历方式

  • for

    List lst=new ArrayList();
    lst.add("zs");
    lst.add("ls");
    lst.add("ww");
    for (int i = 0; i < lst.size(); i++) {
    	System.out.println(lst.get(i));
    }
  • foreach

    List lst=new ArrayList();
    lst.add("zs");
    lst.add("ls");
    lst.add("ww");
    for (String str : lst) {
    	System.out.println(str);
    }
  • 迭代器

    List lst=new ArrayList();
    lst.add("zs");
    lst.add("ls");
    lst.add("ww");
    Iterator iterator = lst.iterator();
    while(iterator.hasNext())
    	System.out.println(iterator.next());

3.删除

  • for正向删除

    List lst=new ArrayList<>();
    lst.add(12);
    lst.add(13);
    lst.add(14);
    lst.forEach(System.out::println);
    System.out.println("删除之前集合大小:"+lst.size());
    int size = lst.size();
    for (int i = 0; i <size; i++) {
    	lst.remove(0);
    }
    System.out.println("删除之后集合大小:"+lst.size());
  • for逆向删除

    List lst=new ArrayList<>();
    lst.add(12);
    lst.add(13);
    lst.add(14);
    lst.forEach(System.out::println);
    System.out.println("删除之前集合大小:"+lst.size());
    int size = lst.size()-1;
    for (int i = size; i >=0; i--) {
    	lst.remove(i);
    }
    System.out.println("删除之后集合大小:"+lst.size());
  • 迭代器删除

    List lst=new ArrayList<>();
    lst.add(12);
    lst.add(13);
    lst.add(14);
    lst.forEach(System.out::println);
    System.out.println("删除之前集合大小:"+lst.size());
    Iterator<String> iterator = lst.iterator();
    //判断下一个元素是否存在
    while(iterator.hasNext()) {
        //若存在,移动到下一个元素位置
        //易出错
        iterator.next();
        //删除元素
        iterator.remove();
    }
    System.out.println("删除之后集合大小:"+lst.size());

4.优化

List集合优化目的在于利用合理的存储空间存下所有元素数据,不多不少,不造成空间浪费。

概念:初始化大小10、负载因子1.5、向下取整

公式:容器大小*1.5倍

例如:10*1.5=15、15*1.5=22、22*1.5=33 ...

public static void main(String[] args) {
    List lst=new ArrayList<>();
    for (int i = 0; i < 50; i++) {
        lst.add(i);
        System.out.println(i);
        getLen(lst);
    }
}

public static void getLen(List lst){
    try {
        Class<? extends List> lstClass = lst.getClass();
        Field field = lstClass.getDeclaredField("elementData");
        field.setAccessible(true);
        Object[] obj = (Object[]) field.get(lst);
        System.out.println("集合的大小是:"+obj.length);
    } catch (Exception e) {
    	e.printStackTrace();
    }
}

四、迭代器原理

List集合迭代器是用来遍历List集合中的元素的工具。它可以按顺序访问List中的每个元素,而不需要知道List的内部结构。迭代器通常包含hasNext()和next()两个方法,前者用来判断是否还有下一个元素,后者用来获取下一个元素。

关于List集合迭代器的原理,它通常是基于List的数据结构实现的。在遍历过程中,迭代器会维护一个指向当前元素的指针,每次调用next()方法时,指针会移动到下一个元素。迭代器还会记录遍历的状态,以便正确地返回hasNext()方法的结果。

五、泛型

 JDK1.5版本以上才有

  • 以类型为参数的类叫做泛型
  • 泛型的默认类型为Object
  • 作用:提高程序的健壮性、简化代码

使用 List 集合时,可以通过指定泛型来限制集合中存储的元素类型。这样可以在编译时就能发现类型不匹配的错误,提高代码的稳定性和可读性。

例如,我们可以创建一个存储整数类型的 List 集合:

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

for (Integer num : list) {
    System.out.println(num);
}

这样就可以确保集合中只能存储整数类型的元素,如果尝试存储其他类型的元素会在编译时报错。

六、装拆箱

当我们将基本数据类型(如int、float等)存储在List集合中时,会发生装箱操作,即将基本数据类型转换为对应的包装类(如Integer、Float等)。而当我们从List集合中取出包装类并转换为基本数据类型时,会发生拆箱操作。

示例:送快递,寄快递时需要对物品进行包裹,收快递后就需要对包裹进行拆包。

  • 装箱(值类型到引用类型

    int a=10;
    Integer b=new Integer(a);
  • 拆箱(引用类型到值类型

    Integer c=new Integer(10);
    int d=c.intValue();

七、ArrayList、LinkedList和Vector的区别

 ArrayList和Vector的区别

ArrayList和Vector都是实现了List接口的动态数组,它们之间的主要区别在于线程安全性和性能。

  1. 线程安全性:
  • ArrayList是非线程安全的,即在多线程环境下使用ArrayList可能会导致并发访问异常(ConcurrentModificationException)。
  • Vector是线程安全的,它的方法都是同步的,可以在多线程环境下安全地使用。
  1. 性能:
  • ArrayList相对于Vector在性能上更好,因为Vector的方法都是同步的,会带来额外的开销。
  • 在单线程环境下,ArrayList的性能更优。

 代码示例:

// ArrayList的使用
List<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");

// Vector的使用
List<String> vector = new Vector<>();
vector.add("X");
vector.add("Y");
vector.add("Z");

LinkedList和Vector的区别 

LinkedList和Vector都是Java中的集合类,但它们有一些区别:

  1. 数据结构:LinkedList是基于链表实现的,而Vector是基于数组实现的。

  2. 线程安全性:Vector是线程安全的,而LinkedList不是线程安全的。

  3. 扩容机制:Vector在扩容时会增加原数组大小的一半,而LinkedList在插入元素时只需要调整相邻节点的指针。

  4. 遍历性能:LinkedList在遍历时需要遍历整个链表,而Vector在遍历时可以通过索引直接访问元素。

  5. 插入和删除操作:LinkedList在任意位置插入和删除元素的性能更好,而Vector在中间插入和删除元素时需要移动其他元素。

 代码示例: 

// 创建一个LinkedList
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");

// 创建一个Vector
Vector<String> vector = new Vector<>();
vector.add("X");
vector.add("Y");
vector.add("Z");

// 遍历LinkedList
for(String str : linkedList) {
    System.out.println(str);
}

// 遍历Vector
for(String str : vector) {
    System.out.println(str);
}

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

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

相关文章

20个改善编码的Python异常处理技巧,让你的代码更高效

异常处理是写好代码的一个重要的方面&#xff0c;虽然许多开发人员都熟悉基本的try-except块&#xff0c;但是有很多更深入的知识可以使异常处理更高效、更可读和更python化。所以本文将介绍关于Python异常的20个可以显著改善编码的Python异常处理技巧&#xff0c;这些技巧可以…

C/C++内存管理学习【new】

文章目录 一、C/C内存分布二、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型四、operator new与operator delete函数五、new和delete的实现原理5.1 内置类型 六、定位new表达式(pl…

天锐绿盾 | 文件数据\资料防泄漏软件 \ 自动智能透明加密保护

怎么防止公司办公终端文件数据资料外泄? 防止公司办公终端文件数据资料外泄是非常重要的&#xff0c;以下是一些有效的措施&#xff1a; 限制访问权限&#xff1a;根据员工的职责和需求&#xff0c;设定文件和数据资料的访问权限。确保只有授权人员才能访问敏感信息。 加密存…

2024图像处理分析与信息工程国际学术会议(IACIPIE2024)

2024图像处理分析与信息工程国际学术会议(IACIPIE2024) 会议简介 2024图像处理分析与信息工程国际学术会议&#xff08;IACIPIE2024&#xff09;将在中国长沙举行。 IACIPIE2024是一个年度会议&#xff0c;探讨图像处理分析和信息工程相关领域的发展和影响&#xff0c;旨在介…

数字孪生低代码平台盘点(一):厂家介绍

特别说明&#xff1a;本文根据网上资料搜集整理而成&#xff0c;排名不分先后&#xff0c;配图是为了更好地阅读体验&#xff0c;并非表明该图为该平台所生产。如有错误之处&#xff0c;请在评论区提出。 一、优锘ChartBuilder 优锘ChartBuilder是一款基于Web的数据可视化工具…

C++的vector容器->基本概念、构造函数、赋值操作、容量和大小、插入和删除、数据存取、互换容器、预留空间

#include<iostream> using namespace std; #include <vector> //vector容器构造 void printVector(vector<int>& v) { for (vector<int>::iterator it v.begin(); it ! v.end(); it) { cout << *it << " "…

挑战杯 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

RGB颜色如何转换为十六进制?16进制颜色代码怎么转为RGB颜色值?

我们在调整网站的色彩搭配&#xff0c;或修改图片的时候&#xff0c;偶尔需要用到RGB颜色值&#xff0c;或者16进制颜色代码。 如果我只知道16进制颜色代码想要知道RGB颜色值&#xff0c;那么16进制颜色代码怎么转为RGB颜色值&#xff1f;又或者我知道RGB颜色值想要知道16进制…

ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器

ubuntu系统上的软件相比CentOS更新还是比较快的&#xff0c;但是还是难免有一些软件更新得不那么快&#xff0c;比如LLVM Clang编译器&#xff0c;目前ubuntu 22.04版本最高还只能安装LLVM 15&#xff0c;而LLVM 18 rc版本都出来了。参见https://github.com/llvm/llvm-project/…

Jenkins使用遇到的一些问题

一&#xff1a;插件依赖报错 比如遇到一堆插件报错&#xff0c;不是提示版本对不上&#xff0c;就是启用不了 这样直接把Jenkins升级就行了&#xff0c;比如我这个是命令行启动的&#xff0c;直接把他替换就好了 如果是遇到插件依赖报错&#xff0c;比如A插件异常 则点击这个插…

训练Sora模型,你可能需要这些开源代码,模型,数据集及算力评估

在之前的文章&#xff0c;我们总结了Sora模型上用到的一些核心技术和论文 复刻大模型 Sora 有多难&#xff1f;一张图带你读懂 Sora 的技术路径一文看懂大模型 Sora 技术推演 今天这篇文章来自我们社区讨论交流&#xff0c;我这边整理和总结现有的一些开源代码、模型、数据集…

网页数据的存储--存储为文本文件(TXT、JSON、CSV)

用解析器解析出数据后&#xff0c;接下来就是存储数据了。数据的存储有多种多样&#xff0c;其中最简单的一种是将数据直接保存为文本文件&#xff0c;如TXT、JSON、CSV等。这里就介绍将数据直接保存为文本文件。 目录 一、Python存储数据的方法 1、 文件读取 2、 文件写入…

milvus Delete api写s3的流程

Delete api写s3的流程 milvus版本:v2.3.2 整体架构: Delete 的数据流向 delete相关配置 dataNode:segment:insertBufSize: 16777216 # Max buffer size to flush for a single segment.deleteBufBytes: 67108864 # Max buffer size to flush del for a single channelsyncPe…

Neo4j导入数据之JAVA JDBC

目录结构 前言设置neo4j外部访问代码整理maven 依赖java 代码 参考链接 前言 公司需要获取neo4j数据库内容进行数据筛查&#xff0c;neo4j数据库咱也是头一次基础&#xff0c;辛辛苦苦安装好整理了安装neo4j的步骤&#xff0c;如今又遇到数据不知道怎么创建&#xff0c;关关难…

【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现

1&#xff0c;视频地址 【wails】&#xff08;4&#xff09;&#xff1a;使用wails做桌面应用开发&#xff0c;整合chatgpt-web项目做前端&#xff0c;进行本地开发&#xff0c;web端也可以连调&#xff0c;使用websocket实现 2&#xff0c;演示效果 启动先是报500 错误&#…

想设计智能手环,我需要设计哪种电路?

随着电子技术的高速发展&#xff0c;可穿戴设备逐渐火爆&#xff0c;其中之一是智能手环&#xff0c;作为现代可穿戴技术的热门产品之一&#xff0c;它集成了多种功能&#xff0c;如健康检测、运动跟踪、通知提醒等&#xff0c;为了实现这些功能&#xff0c;需要用上哪些电路模…

蜂窝物联网咖WiFi认证解决方案

项目背景 随着目前网咖模式越来越流行&#xff0c;给网吧部署一套无缝漫游的WIFI网络势在必行。同时&#xff0c;网吧无线准入的验证码在客户机上面进行更新&#xff0c;以防周边的人员进行蹭网&#xff0c;损失网吧的外网带宽。 01 需求分析 1. 网吧服务区域全部覆盖无盲区…

免费的WP模板网站推荐

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html wordpress免费企业主题 深蓝色经典实用的wordpress网站模板&#xff0c;用wordpress免费企业主题搭建网站。 http…

大模型+影像:智能手机“上春山”

这个春节假期&#xff0c;一首《上春山》火了。吃瓜群众热热闹闹学了一个假期的“春山学”&#xff0c;了解了抢占C位的各种技巧。 假期过去&#xff0c;开工大吉&#xff0c;手机行业开始抢占今年的C位。那么问题来了&#xff0c;今年智能手机最大的机会点在哪里&#xff1f;答…

华为---RSTP(一)---RSTP简介

目录 1. STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;的作用 2. STP的缺点 2.1 STP网络拓扑收敛慢 2.2 STP网络链路故障&#xff0c;端口状态切换慢 2.3 终端链路参与STP网络运算&#xff0c;浪费网络资源 2.4 STP网络拓扑变更机制复杂&…