• java集合之UML介绍&List集合&ArrayList的扩容


    ArrayList集合怎么使用?


    目录

    一 . 常用集合类

    UML的相关介绍:

    UML解析图:

    List集合

     特点

     遍历

     扩容

     实现

     ArrayList remove的注意点


    一 . 常用集合类

    UML的相关介绍:

    UML:统一建模语言,是一种模型化语言 

    模型大多以图表的方式表现出来

    建模图表通常包含几个块或框连接线和作为模型附加信息之用的文本,在UML规则中相互

    联系和扩展

    为什么使用UML图?

    (1)UML统一了各种方法对不同类型的系统、不同开发阶段以及不同内部概念的不同观  点,从而有效的消除了各种建模语言之间不必要的差异。它实际上是一种通用的建模语言,可以为许多面向对象建模方法的用户广泛使用。

    (2)UML建模能力比其它面向对象建模方法更强。它不仅适合于一般系统的开发,而且对并行、分布式系统的建模尤为适宜。

    (3)UML是一种建模语言,而不是一个开发过程。

      

    UML解析图:🍖🍖🍭🍭🍬🍬🍡🍡❤❤🧡🧡💛💛❤❤💚💚💙💙💜💜🤎🤎🖤🖤☯☯👇👇

    List集合

     特点

    元素有序,且可重复

     遍历

    下标foreach迭代器

     扩容

    初始容量10,负载因子0.5,扩容增量0.5倍

    新容量=原容量+原容量*0.5,如ArrayList的容量为10,一次扩容后是容量为15

     实现

    ArrayList

                      简单数据结构,超出容量自动扩容,动态数组

                      内部实现是基于基础的对象数组的

                      随机访问快

                      不适合随机增加或者删除

                      线程不安全

    LinkedList

                      LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部

                      LinkedList的首部或尾部

                      线程不安全

                      LinekedList可被用作堆栈(stack)【包括push,pop方法】,队列(queue)或              双向队列(deque)

                      以双向链表实现,链表无容量限制,允许元素为null,线程不安全

    Vector

                      线程安全

                      并行性能慢,不建议使用

    CopyOnWriteArrayList

                      写时复制

                      线程安全

                      适合于读多,写少的场景

                      写时复制出一个新的数组,完成插入,修改或者移除操作后将新数组赋值给array

                      比Vector性能高

                      最终一致性

                      实现了List接口,使用方法与ArrayList类似

                     

     ArrayList remove的注意点(注意点

    remove的特性:

    •         传入整数类型时删除下标
    •         传入对象类型时删除对应的元素(如 Integer.parseInt(null))

    数据准备:为准备演示,需要有紧挨在一起的两个或多个相同的元素

    错误示例:

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

    第一种:(ArryList在增加和删除时有位移的现象,当两个2致的元素3相邻时,第一个3被删除后,第二个3会向前移动一位,这时候移动的这位3的下标就变成是3,已经判断过了,所有这个3不会被删除)

    1. for(int i=0;i<list.size();i++){
    2. if(list.get(i)==3) list.remove(i);
    3. }

    第二种:(因为ArrayList中有一个变量(modCount=原数组的元素个数)还在内部封装了一个内部类(Itr),这个内部类实现了迭代器,当使用foreach方法遍历时,使用的是ArrayList内部类的迭代器,其中内部类中定义了一个改变次数的变量(expectedModCount),这个变量被赋值为外部modcount的值,当使用内部类(Itr)发生增加或者修改操作时,抛出异常,其目的是阻止ArrayList长度发生改变。)

    1. for(Integer i:list){
    2. if(i==3) list.remove(i);
    3. }

    不推荐使用foreach进行集合的增加和删除操作哦,它比较适合遍历数据

    正确示例

    第三种:(使用了i--,即在进行删除之后指针会向前移一位,再回到删除过的下标位置进行判断,而这样就避免了因为ArrayList的位移现象所导致的判断遗漏。)

    注意:不可使用--i,因为--i会在remove方法在删除之前执行

    1. for(int i=0;i<list.size();i++){
    2. if(list.get(i)==3) list.remove(i--);
    3. }

    第四种:(for循环中 条件为i--,使用了从集合中的最后一位元素向第一位元素方向进行遍历的倒序遍历方法,这样即使ArrayList的位移现象发生也无法对删除产生影响)

    最后一种写法:ArrayList集合在进行删除、增加等操作时,要考虑其动态位移的特性,推荐使用迭代器,会比较安全

    1. for(int i=list.size()-1;i>=0;i--){
    2. if(list.get(i)==3){
    3. list.remove(i);
    4. }
    5. }

    注意:上述代码的it.remove不要写成list.remove(i)

    第五种

    1. Iterator<Integer> it=list.iterator();
    2. while(it.hasNext()){
    3. if(it.next()==3){
    4. it.remove();
    5. }
    6. }

    第六种

    1. Iterator<Integer> it=list.iterator();
    2. while(it.hasNext()){
    3. Integer value=it.next();
    4. if(value==3){
    5. list.remove(value);
    6. }
    7. }

     list.remove(2); 输出结果是什么?


    感谢收看鸭~

  • 相关阅读:
    【一起来学C++】————(7)多态
    Vue - 图片浏览组件v-viewer
    LeetCode刷题(python版)——Topic63. 不同路径 II
    【GeoServer 入门(使用版)】Hello world
    OCP Java17 SE Developers 复习题05
    SQL语法之JOIN
    GNU和Linux的关系、 Linux的发行版本、CentOs和RedHat的区别
    如何将网站部署到浏览器?
    1014 Waiting in Line
    【微信小程序】关于页面中引入背景的两种方式
  • 原文地址:https://blog.csdn.net/m0_64043477/article/details/125484010