• java集合之常用集合类——list集合


    目录

    UML图是什么:

     list集合:

    list集合的实现类:

    ArrayList

    LinkedList

    Vector——一般情况不推荐使用原因如下:

    CopyOnWriteArrayList——和Vector不同且推荐使用

    ArrayList使用remove的注意点


    UML图是什么:

     list集合:

    • 特点:元素有序,且可重复
    • 遍历方式:下标,foreach,迭代器
    • 扩容方式:初始容量为10,负载因子为0.5,扩容增量为0.5倍
    • 新容量 = 原容量 + 原容量 * 0.5  , 如 ArrayList的容量为10,一次扩容后是容量为15

    list集合的实现类:


    • ArrayList

    • 特点:1.简单数据结构,超出容量自动扩容,动态数组

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

                      3.随机访问快

    • 弊端:1.不适合随机增加和删除

                      2.线程不安全

    • 常用方法:1.add

                             2.remove

    • LinkedList

    • 特点:1.LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部

                      2.以双向链表实现,链表无容量限制,允许元素为null

                            

                      3.适合做随机的增加或删除

    • 弊端:线程不安全
    • 常用方法:1.LinkedList可被用作堆栈(stack)【包括了push,pop方法】

                             2.队列(queue)或双向队列(deque)

    • Vector——一般情况不推荐使用原因如下:

    • 特点:线程安全
    • 弊端:安全性能慢,所有不建议使用

        举个为什么不用的例子:假如一个厕所有3个坑,然后你一个人进去,把门关了,一个人占了3个坑,其他的不同就浪费,等你上完厕所再出去,就相当于你运行完了之后,再开大门

    • CopyOnWriteArrayList——和Vector不同且推荐使用

    • 特点:1.写时复制和Vector差不多,但是有一点不一样下面解释

                      2.线程安全

                            

                      3.适用于读多写少的场景

                    

                      4.和Vector相比,性能高

                    

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

                       不同点--举个例子:在读取的时候,会自动复制一份,然后给它自己使用,这样

                         就不会浪费资源且不会影响性能,自己写自己的,然后复制的这一份,最终在

                        复制的这一份完成后,就统一使用复制的这一份,之前那一份就不用了,是                           不是不占资源

                      6.最终一致性

                      7.实现了List接口,使用方式与ArrayList类似

                    

    ArrayList使用remove的注意点

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

    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);

    1.下列代码错误,为啥?

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

    错误分析:1.不能删除挨在一起的重复值,原因指定的值被删掉之后,下一个就会第上去代替被删掉的值的下表,然后i++就放下判断了,就像上面的例子,3被删了之后,然后第二个3

    就第上去,代替原来的3的下表,然后系统就接着查下标为4的值了。

    2.下列代码正确,对上个代码的优化。

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

    分析:i--这样就可以继续判断代替的3这个值的下标。

    3.下列代码正确,对上上个代码的优化。

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

    4.下列代码错误,为啥?

    1. public void remove01(){
    2. for(Integer i:list){
    3. if(i==3) list.remove(i);
    4. }
    5. }

    错误分析:代码中的i指的是下标,所有此代码中的  i=3  

    5.下列代码正确,为啥?

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

    分析:使用的list集合中的迭代器的hasNext来获取下一个值,就可以删掉重复的值,知道删除完为止。

    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. }

    分析:用的是迭代器方法,但是没有用迭代器的删除方法。

    7.下列代码错误,为啥?

    list.remove(2)

    分析:不能删掉3这个值,原因是2表示为下标,如果为字符串就直接上掉2这个内容

    1. list.remove(Integer.valueOf(2));
    2. syso(list);

     分析:这个删掉的是一个对象,就相当于直接删掉了2这个值,而不是下标。

     

    set集合:

    • 特点:元素无序(意思就是你放进去的数据顺序和读取出来的数据顺序不一样),且不可重复
    • 遍历方式:foreach,迭代器
    • 扩容方式:初始容量为16,负载因子为0.75,扩容增量为1倍
    • 新容量 = 原容量 + 原容量 * 0.75 

    思考:如果对List容器中的元素去重?

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

     

    调用去重的方法:

    结果:

     

    set集合的实现类:


    • HashSet

    • 特点:1.它存储唯一元素并允许空值,能依据对象的hashcode来确定该元素是否存在

                      2.由HashMap支持

    • 弊端:1.不保持插入顺序

                      2.非线程安全

  • 相关阅读:
    Excel表格总是处于只读状态怎么解决?
    Linux配置telnet服务端
    【UV打印机】PrintExp打印软件教程(五)-高级
    计算机视觉传统图像处理库opencv的使用
    OpenCV5-图像几何变换
    【Python基础】字典和函数拓展
    stream流—关于Collectors.toMap使用详解
    Faiss:高效相似性搜索与聚类的利器
    飞花令游戏(Python)
    存储芯片大厂集体“越冬” 头部厂商扎堆砍单、业绩下滑
  • 原文地址:https://blog.csdn.net/qq_62881798/article/details/125492328