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

目录

​编辑

一、什么是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.mzph.cn/news/699020.shtml

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

相关文章

前端项目打包体积分析与优化

一、安装依赖分析工具 npm install webpack-bundle-analyz 二、修改webpack.config.js文件 1、导入上面下载的包 2、在plugins里创建实例 三、启动打包命令 npm run build 会弹出如下界面&#xff1a; 四、优化 1、通过CDN导入react-dom文件 修改webpack.config.js文件里…

Windows 远程控制 Mac 电脑怎么操作

要从 Windows 远程控制 Mac 电脑&#xff0c;您可以使用内置 macOS 功能或第三方软件解决方案。以下是一些方法&#xff1a; 一、使用内置 macOS 功能&#xff08;屏幕共享&#xff09; 1、在 macOS 上启用屏幕共享 转至系统偏好设置 > 共享&#xff1b;选中“屏幕共享”…

八、线性代数二 ,矩阵的秩

目录 1、矩阵子式的定义与子式个数的计算&#xff1a; 2、矩阵秩的定义&#xff1a; 3、矩阵秩的计算方法&#xff1a; 4、矩阵秩的 性质&#xff1a; 线性代数四——几个重要的矩阵点积_线性代数 矩阵点积-CSDN博客 1、矩阵子式的定义与子式个数的计算&#xff1a; 概念&…

C# OpenCvSharp 利用白平衡技术进行图像修复

目录 效果 灰度世界(GrayworldWB)-白平衡算法 完美反射(SimpleWB)-白平衡算法 基于学习的(LearningBasedWB)-白平衡算法 代码 下载 C# OpenCvSharp 利用白平衡技术进行图像修复 OpenCV xphoto模块中提供了三种不同的白平衡算法&#xff0c;分别是&#xff1a;灰度世界(G…

华清远见嵌入式学习——驱动开发——day9

目录 作业要求&#xff1a; 作业答案&#xff1a; 代码效果&#xff1a; ​编辑 Platform总线驱动代码&#xff1a; 应用程序代码&#xff1a; 设备树配置&#xff1a; 作业要求&#xff1a; 通过platform总线驱动框架编写LED灯的驱动&#xff0c;编写应用程序测试&…

危险!Wyze 摄像头安全漏洞致1.3万用户隐私遭窥探

最近&#xff0c;一则关于 Wyze 摄像头再次出现安全漏洞的新闻引起了人们的广泛关注。据报道&#xff0c;该安全漏洞导致约1.3万用户的摄像头受到了未经授权的访问&#xff0c;使得这些用户的隐私信息遭到了窥视。这一事件再次引发了人们对网络安全的关注和讨论。 网络安全不仅…

啊丢的刷题记录手册

1.洛谷题P1923 求第k小的数 题目描述 输入 n&#xff08;1≤n<5000000 且 n 为奇数&#xff09;个数字ai​&#xff08;1≤ai​<109&#xff09;&#xff0c;输出这些数字的第 k 小的数。最小的数是第 0 小。 请尽量不要使用 nth_element 来写本题&#xff0c;因为本题…

module ‘json‘ has no attribute ‘dumps‘

如果在使用Python的json模块时遇到AttributeError: module json has no attribute dumps错误&#xff0c;通常是因为在Python环境中json模块不支持dumps方法。这种情况可能是因为Python的json模块被重命名或修改过导致的。 解决方法可以尝试以下几种&#xff1a; 1.检查Pytho…

基于DPU和HADOS-RACE加速Spark 3.x

背景简介 Apache Spark&#xff08;下文简称Spark&#xff09;是一种开源集群计算引擎&#xff0c;支持批/流计算、SQL分析、机器学习、图计算等计算范式&#xff0c;以其强大的容错能力、可扩展性、函数式API、多语言支持&#xff08;SQL、Python、Java、Scala、R&#xff09…

springsecurity+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

鸿蒙LiteOS-M 内核初始化

目录 一、LiteOS-M 初始化内核二、LOS_KernelInit代码分析三、LOS_Start代码解析坚持就有收获 一、LiteOS-M 初始化内核 在LiteOS-M应用程序中&#xff0c;系统初始化如下&#xff1a; /*** brief This is the ohos entry, and you could call this in your main funciton af…

2024如何恢复旧版的Chrome的主题样式

起因 chrome 更新版本之后的主题样式变成了浅紫色的页签卡样式&#xff0c;感觉很不习惯&#xff0c;也很不喜欢 如何换回旧版主题 通过主题商店&#xff0c;安装旧版本的主题 主题商店搜索下面&#xff0c;或着直接访问下面的地址 Chrome Original White Theme https://…

vue手写卡片切换,并且点击获取到卡片信息

需求&#xff1a;做一个卡片样式的列表&#xff0c;之后有一些基本信息&#xff0c;之后卡片选中后样式不一样&#xff0c;默认选中第一个卡片&#xff0c;点击卡片后可以获取到卡片的信息 一、效果 二、关键代码 index默认重0开始,activeTable默认为0,0-0等于0&#xff0c;但…

Facebook的数字社交使命:连接世界的下一步

在数字化时代&#xff0c;社交媒体已成为人们生活的重要组成部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;一直以来都在努力履行着自己的使命——连接世界。然而&#xff0c;随着时代的变迁和技术的发展&#xff0c;Facebook正在不断探索着连接世界的下…

Kafka:kafka的技术架构? ①

一、Kafka的优势 Apache Kafka是一个开放源代码的分布式事件流平台&#xff0c;成千上万的公司使用它来实现高性 能数据管道&#xff0c;流分析&#xff0c;数据集成和关键任务等相关的应用程序。 二、技术架构 0&#xff09;partition分区可以设置备份数&#xff0c;也可以设…

Go 如何按行读取(大)文件?尝试 bufio 包提供的几种方式

嗨&#xff0c;大家好&#xff01;我是波罗学。本文是系列文章 Go 技巧第十七篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 本文将介绍 Go 如何按行读取文件&#xff0c;基于此会逐步延伸到如何按块读取文件。 引言 我们将要介绍的按行读取文件的方式其实是非常适合…

C# 1.消息队列MQ使用场景--图文解析

为什么使用消息队列MQ&#xff08;Message Queue&#xff09;&#xff1f; 消息队列有什么优点和缺点&#xff1f; Kafka(大数据日志采集)、ActiveMQ(最早的MQ--目前使用较少)、RabbitMQ(开源&#xff0c;中小型企业使用足够)、RocketMQ(阿里开发&#xff0c;大型企业适用) 都…

125 Linux C++ 系统编程4 Linux 静态库制作,动态库制作,静态库和动态库对比。静态库运行时找不到库的bug fix

一 静态库 和动态库 对比 静态库的原理&#xff1a;假设我们有一个 静态库&#xff0c;大小为500M&#xff0c;这个静态库实现了一些打牌的逻辑算法&#xff0c;提供了一堆API&#xff0c;让开发者 可以轻松的实现 54张扑克牌的随机发牌&#xff0c;指定发牌等功能。 我们写了…

Python入门学习——基础语法

一、Python解释器 1. Python解释器的作用是&#xff1a; 将Python代码翻译成计算机认识的O和1并提交计算机执行在解释器环境内可以一行行的执行我们输入的代码也可以使用解释器程序&#xff0c;去执行".py"代码文件 2. Python解释器程序在&#xff1a; <Python…

google浏览器chrome无法访问localhost等本地虚拟域名的解决方法

场景一&#xff1a; 谷歌浏览器访问出现&#xff1a;forbbiden 403 问题&#xff0c;或者直接跳转到正式域名(非本地虚拟域名) 访问本地的虚拟域名http://www.hd.com/phpinfo.php?p1发生了302 条状 火狐浏览器正常访问; 解决方法&#xff1a; 方法1&#xff1a;在谷歌浏览器…