• Java集合之List


    hello,家人们我来啦~ 今天要学的是框架集合噢

    目录

    一.🍭🍭UML

    UML解析图:

    UML的简介 

    UML的关系

    UML的语法描述

    二.🍉🍉List

    list的特点?

    list通过什么方式遍历?

    list可以扩容吗?是怎么样的?

    三.🍓🍓List通过什么来实现的?

    ArrayList

    LinkedList

    Vector

    CopyOnWriteArrayList


    一.🍭🍭UML

    • UML解析图:

    • UML的简介 

         1.UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。适用于描述以用例为驱动,以体系结构为中心的软件设计的全过程。


        2.UML的定义包括UML语义和UML表示法两个部分:
               <1>.UML语义:UML对语义的描述使开发者能在语义上取得一致认识,消除了因人而异的表达方法所造成的影响;
               <2>.UML表示法:UML表示法定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语法为系统建模提供了标准
     

     

    • UML的关系

    1.依赖[depedency]是两个事物之间的语义关系,其中一个事物(独立事物)发生变化,会影响到  
      另一个事物(依赖事物)的语义
    2.关联[association]是一种结构关系,它指明一个事物的对象与另一个事物的对象间的联系
    3.泛化[generalization]是一种特殊/一般的关系。也可以看作是常说的继承关系
    4.实现[realization]是类元之间的语义关系,其中的一个类元指定了由另一个类元保证执行的契约
     

    • UML的语法描述

     

    二.🍉🍉List

    • list的特点?

    元素有序,且可重复

    • list通过什么方式遍历?

           下标,foreach,迭代器

    • list可以扩容吗?是怎么样的?

     可以扩容

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

    新容量=原容量+原容量*0.5

    三.🍓🍓List通过什么来实现的?

    • ArrayList

    1.ArrayList是什么?

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口

     

    2.ArrayList 的特缺点

    底层结构就是一个长度可以动态增长的数组,数组的优缺点决定了ArrayList的优缺点;数组按索引查询最快,添加删除元素都要大量移动元素,效率很低

     (1)优点:索引查询速度最快;长度可以自动动态变化

     (2)缺点:添加和删除效率低;按照内容查询需要逐个比较,效率低下,线程不安全

    3.什么时候使用ArrayList?

      (1) 添加删除操作多的时候,不建议使用;

      (2) 遍历时,按照索引随机获取某一个元素操作多时候,建议使用

    4.ArrayList的类图

     

    5.ArrayList remove的注意点(去重)

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

    1. package com.zking.dao;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class Test {
    5. public static void main(String[] args) {
    6. List<Integer> list=new ArrayList<Integer>();
    7. list.add(1);
    8. list.add(2);
    9. list.add(3);
    10. list.add(3);
    11. list.add(4);
    12. }
    13. }

    第一种:

    1. /*第一种 结果:会去掉第二个3*/
    2. for (int i = 0; i < list.size(); i++) {
    3. if(list.get(i)==3)list.remove(i);
    4. }

    第二种:

    1. /*第二种 结果:3会全部去掉*/
    2. for (int i = 0; i <list.size(); i++) {
    3. if(list.get(i)==3)list.remove(i--);
    4. }

    第三种:

    1. /*第三种 结果:3也会全部去掉*/
    2. for (int i =list.size()-1; i>=0;i--) {
    3. if(list.get(i)==3) {
    4. list.remove(i);
    5. }
    6. }

     

    第四种:

    1. /*第四种 直接会报错*/
    2. for (Integer i : list) {
    3. if(i==3)list.remove(i);
    4. }

    第五种:

    1. /*第五种 结果:3也会全部去掉*/
    2. Iterator<Integer> it=list.iterator();
    3. while(it.hasNext()) {
    4. if(it.next()==3) {
    5. it.remove();
    6. }
    7. }

    第六种:

    1. /*第六种 直接报错*/
    2. Iterator<Integer> it=list.iterator();
    3. while(it.hasNext()) {
    4. Integer value=it.next();
    5. if(value==3) {
    6. list.remove(value);
    7. }
    8. }

    第七种:

    1. /*第七种 这样写是去除下标为2的数字*/
    2. list.remove(2);


    • LinkedList

    1.什么是LinedList?

    LinkedList类是List接口的实现类,它是一个集合,可以根据索引来随机的访问集合中的元素,还实现了Deque接口,它还是一个队列,可以被当成双端队列来使用。虽然LinkedList是一个List集合,但是它的实现方式和ArrayList是完全不同的,ArrayList的底层是通过一个动态的Object[]数组来实现的,而LinkedList的底层是通过链表来实现的,因此它的随机访问速度是比较差的,但是它的删除,插入操作会很快

    • LinkedList是基于双向循环链表实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。
    • LinkedList同样是非线程安全的,只在单线程下适合使用。
    • LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆

    2.LinkedList的类图(基于jdk1.8)

     3.LinkedList的特点

    • 允许有null值
    • 内部以双向链表的形式来保存集合中的元素
    • 实现了Deque接口,意味着可以当做双端队列、栈来使用
    • 线程不安全,线程安全的可以使用:List list = Collections.synchronizedList(new LinkedList(…));
    • fail-fast机制
    • 所有指定位置的操作都是从头开始遍历进行的
    • 元素是有序的,输出顺序与输入顺序一致


    • Vector

    1.什么是Vector?

    Vector,来自于JDK1.0 的古老集合类,继承自 AbstractList,实现了 List 接口 ,底层是数组结构

    vector还是一个动态数组,用于维护一段连续的动态控件,内部有三个成员函数,用来储存起始位置,已使用位置,以及最后位置,每当动态内存用完时,它会按照原内存的2倍,重新申请新内存。将原内存的数据拷贝到新内存,释放掉原内存

    2.Vector的优缺点

    优点:线程安全

    缺点:性能慢,不建议使用

    3.Vector的类图

     


    • CopyOnWriteArrayList

    1.CopyOnWriteArrayList是什么?

    CopyOnWriteArrayList是线程安全版本的ArrayList,也叫做写时复制

    2.ConOnWriteArrayList的特点

    • 它最适合于具有一下特征的应用程序:list大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突
    • 它线程是安全的
    • 因为通常需要复制整个基础数组,所以可变操作(add(),set(),remove(),等等)的开销很大
    • 迭代器支持hasNext(),next()等不可变操作,但不支持可变remove()等操作
    • 使用迭代器进行遍历的速度很快,并且不会于其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照

     

     

    3.CopyOnWriteArrayList中 增删改操作的大致流程

    先加锁,然后复制一份源数组,操作完后写入源数组,释放锁

    4.CopyOnWriteArrayList的短处

    因为每次写操作都需要复制一份新数组,所以写操作性能低下,尤其是数组长度很长时,不建议使用CopyOnWriteArrayList

    5.CopyOnWriteArrayList的类图

     

    CopyOnWriteArrayList的结果是 最终一致性

    🍉🍉注:CopyOnWriteArrayList返回迭代器不会抛出ConcurrentModificationException异常,所以它不是fail-fast机制的.

  • 相关阅读:
    『Java安全』Struts 2.2.3 表单参数类型转换错误OGNL注入漏洞S2-007复现与浅析
    网络三维虚拟展馆开发优势
    maven项目运行错误:找不到或无法加载到xxx类、亦或者xml(yml、properties)等等文件
    创意中秋与国庆贺卡 - 用代码为节日增添喜悦
    REST 服务
    使用 OpenTracing 和 LightStep 监控无服务器功能
    P8193 [USACO22FEB] 高维前缀和
    Spark的内存管理机制
    【面试怎么聊得开?搞懂这几个性能术语,面试官高看你一眼!】
    系统架构设计:18 论基于DSSA的软件架构设计与应用
  • 原文地址:https://blog.csdn.net/weixin_65975275/article/details/125484322