• 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集合数据存进去的顺序和取出来的顺序一致

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

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

    2.遍历方式

    • for

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

      1. List lst=new ArrayList();
      2. lst.add("zs");
      3. lst.add("ls");
      4. lst.add("ww");
      5. for (String str : lst) {
      6. System.out.println(str);
      7. }
    • 迭代器

      1. List lst=new ArrayList();
      2. lst.add("zs");
      3. lst.add("ls");
      4. lst.add("ww");
      5. Iterator iterator = lst.iterator();
      6. while(iterator.hasNext())
      7. System.out.println(iterator.next());

    3.删除

    • for正向删除

      1. List lst=new ArrayList<>();
      2. lst.add(12);
      3. lst.add(13);
      4. lst.add(14);
      5. lst.forEach(System.out::println);
      6. System.out.println("删除之前集合大小:"+lst.size());
      7. int size = lst.size();
      8. for (int i = 0; i
      9. lst.remove(0);
      10. }
      11. System.out.println("删除之后集合大小:"+lst.size());
    • for逆向删除

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

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

    4.优化

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

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

    公式:容器大小*1.5倍

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

    1. public static void main(String[] args) {
    2. List lst=new ArrayList<>();
    3. for (int i = 0; i < 50; i++) {
    4. lst.add(i);
    5. System.out.println(i);
    6. getLen(lst);
    7. }
    8. }
    9. public static void getLen(List lst){
    10. try {
    11. Classextends List> lstClass = lst.getClass();
    12. Field field = lstClass.getDeclaredField("elementData");
    13. field.setAccessible(true);
    14. Object[] obj = (Object[]) field.get(lst);
    15. System.out.println("集合的大小是:"+obj.length);
    16. } catch (Exception e) {
    17. e.printStackTrace();
    18. }
    19. }

    四、迭代器原理

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

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

    五、泛型

     JDK1.5版本以上才有

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

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

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

    1. List list = new ArrayList<>();
    2. list.add(1);
    3. list.add(2);
    4. list.add(3);
    5. for (Integer num : list) {
    6. System.out.println(num);
    7. }

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

    六、装拆箱

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

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

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

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

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

    七、ArrayList、LinkedList和Vector的区别

     ArrayList和Vector的区别

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

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

     代码示例:

    1. // ArrayList的使用
    2. List arrayList = new ArrayList<>();
    3. arrayList.add("A");
    4. arrayList.add("B");
    5. arrayList.add("C");
    6. // Vector的使用
    7. List vector = new Vector<>();
    8. vector.add("X");
    9. vector.add("Y");
    10. vector.add("Z");

    LinkedList和Vector的区别 

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

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

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

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

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

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

     代码示例: 

    1. // 创建一个LinkedList
    2. LinkedList linkedList = new LinkedList<>();
    3. linkedList.add("A");
    4. linkedList.add("B");
    5. linkedList.add("C");
    6. // 创建一个Vector
    7. Vector vector = new Vector<>();
    8. vector.add("X");
    9. vector.add("Y");
    10. vector.add("Z");
    11. // 遍历LinkedList
    12. for(String str : linkedList) {
    13. System.out.println(str);
    14. }
    15. // 遍历Vector
    16. for(String str : vector) {
    17. System.out.println(str);
    18. }
  • 相关阅读:
    CSS-盒子模型-内容,边框,内边距,外边距,(合并,塌陷情况)
    JAVA进程CPU负载过高导致问题分析
    【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)
    iOS Swift 拍照识别数字(Recognizing Text in Images)
    罗马数字转整数[简单]
    Hive中Join优化的几种算法
    Small Pipefish
    姿态估计评价指标
    SpringSecurity系列 - 09 SpringSecurity 自定义认证数据源实现用户认证
    css实现盒子的四周阴影
  • 原文地址:https://blog.csdn.net/weixin_74457789/article/details/136242147