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.hqwc.cn/news/487367.html

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

相关文章

JAVA工程师面试专题-Mysql篇

一、基础 1、mysql可以使用多少列创建索引&#xff1f; 16 2、mysql常用的存储引擎有哪些 存储引擎Storage engine&#xff1a;MySQL中的数据、索引以及其他对象是如何存储的&#xff0c;是一套文件系统的实现。常用的存储引擎有以下&#xff1a; Innodb引擎&#xff1a;In…

Android相机调用-libusbCamera【外接摄像头】【USB摄像头】 【多摄像头预览】

有的自定义系统&#xff0c;对于自己外接的USB摄像头&#xff0c;android原生的camera和camera2都无法打开&#xff0c;CameraX也用不了。这时候就要用libusbCamera&#xff0c;这个库可以打开摄像头&#xff0c;还可以多摄像头同时预览。本文主要是同时打开3个USB摄像头的项目…

Java学习笔记2024/2/23

今日内容 多态 包 final 权限修饰符 代码块 教学目标 能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型能够知道多态的使用场景包的作用public和private权限修饰符的作用描述final修饰的类的特点描述final修饰的方法的特点描述final修饰的变量的特点 第…

使用 Visual Studio 断点调试 DLL

继上文说到使用 IDA 和 WinDbg 调试无 dmp 文件 那么在有源码的情况下可以直接断点调试 DLL&#xff0c;目的是查看 DLL 内部的函数调用 场景&#xff1a; 程序执行到某个 DLL 时突然崩溃&#xff0c;先确定 Debug 生成的 DLL 在程序中运行是否也会有闪退 如果有&#xff0c;则…

knife4j springboot3使用

简介 在日常开发中&#xff0c;写接口文档是我们必不可少的&#xff0c;而Knife4j就是一个接口文档工具&#xff0c;可以看作是Swagger的升级版&#xff0c;但是界面比Swagger更好看&#xff0c;功能更丰富 使用 我使用的是springboot3.2.3 knife4j 4.3.0,knife4j 4.4版本有…

fpga_cpu加速

一 cpu流水线执行指令 二 计算机体系结构 注&#xff1a;ARM就是典型的哈佛结构 三 cpu加速 同样采用流水线&#xff0c;哈佛结构的指令效率更高&#xff0c;通过指令预取&#xff0c;提高了流水线的并行度。

线程的同步(synchronized的原理和用法,解决线程同步时的通信问题)

线程的同步锁&#xff08;synchronized&#xff09; 为什么会出现线程的同步锁&#xff1f; 因为JVM虚拟机是抢占调度模型&#xff0c;当多个线程在同时访问一个资源时会发生两个线程争抢一个资源&#xff0c;在一个线程没有执行结束时&#xff0c;另一个线程抢到资源&#x…

如何在 Tomcat 中为 Web 应用程序启用和配置缓存?

在Tomcat中为Web应用程序启用和配置缓存通常涉及到对Tomcat的连接器&#xff08;Connector&#xff09;进行配置&#xff0c;以及可能的话&#xff0c;配置Web应用程序本身以支持缓存。 1. 配置Tomcat连接器以启用缓存 Tomcat的连接器可以通过其配置来启用各种…

怎么在wifi中实现手机和电脑文件互传

有时我们想手机电脑文件互传&#xff0c;数据线却不在身边&#xff0c;这时我们可以用MiXplorer来实现wifi中手机和电脑互相访问文件。 MiXplorer是一款来自著名安卓开发者论坛XDA的作品&#xff0c;免费且功能强大&#xff0c;被很多人誉为是“全能文件管理器”。 1.在手机上…

分布式系统 —— 分布式线性回归的应用

在本文中&#xff0c;你将学习如何在分布式环境中实现线性回归。 1. 题目背景 假设每个节点i都可以访问以下观测数据&#xff1a; 给定的公式 描述了每个节点观察到的线性关系&#xff0c;其中 是第 次观察的已知输入。 是第 次观察的已知输出。 和分别是未知的斜率系数和截距…

PostMan使用自带js库base64编码、sha256摘要、环境变量的使用

目录 1、环境变量的使用2、base64编码、sha256摘要、以及脚本的使用3、脚本代码 在请求调试接口的过程中&#xff0c;因为要使用大量相同的参数&#xff0c;使用变量的方式能很大程度上减轻接口调用的工作量 版本说明&#xff1a;Postman for Windows&#xff0c;Version&#…

uniapp_微信小程序自定义顶部导航栏和右侧胶囊对齐(不对齐来打我)

一、想要的效果 思路首先开启自定义导航栏&#xff0c;取消自带的导航栏&#xff0c;然后计算胶囊的高度和标题对齐 二、成品代码 1、首先再你需要居中的代码添加以下style <view class"header":style"{paddingTop:navBarTop px,height:navBarHeight px,…