• Java学习----习题总结


    今日学习内容总结如下:

    概述Collection、List和Set接口

    Collection接口是List接口与Set接口的父类接口,而各个集合的又是List接口与Set接口的实现类。
    Collection接口   无序  允许重复
    public interface Collection extends Iterable
    常见方法:
        int size();获取集合中的元素个数
        boolean contains(Object o) 判断集合中是否有指定的对象,有true没有false。
        元素相等是依赖于equals方法实现的
         Object[] toArray();将集合转换为Object类型的数组
           T[] toArray(T[] a);    
              String[] arrs=cols.toArray(new String[] {});
          boolean add(E e);向集合中新增元素,成功true否则false
          boolean remove(Object o);删除指定的元素o,相等判断使用equals
          void clear(); 清空集合中的所有元素    

    List接口  有序【有下标序号】   允许重复
    public interface List extends Collection
    特殊的方法就是引入序号
         E get(int index);按照索引序号获取指定位置上的元素,需要不能越界
         E set(int index, E element);修改指定位置上的元素,覆盖
         void add(int index, E element);向指定位置上添加元素,原始数据后移
        E remove(int index);删除指定位置上的元素,并返回被删除的元素,原始位置上的元素前移
            有可能产生二义性的用法
                List list=...;
                list.remove(3);  调用的是remove(int)方法,不是指定元素删除,而是指定位置删除
                list.remove(Integer.valueOf(3)); 删除指定元素,不是序号
        int indexOf(Object o);从前向后查找第一次出现o的下标位置,如果查不到则返-1
        int lastIndexOf(Object o);从后向前查找
    List接口与Collection接口相比,比其增加了一个get()、set()方法,可以通过指定的索引值取得
    修改、内容。要想取得接口的实例化对象则其必须有子类,在List接口下有三个常用子类:
    ArrayList、LinkedList、Vector

    Set接口  无序【没有下标序号】 不允许重复
    HashSet的特点:无序且不可重复       
    1.存储时顺序和取出的顺序不同
    2.不可重复
    3.放到hashSet集合的元素实际上是放到HashMap集合的key部分了。
    TreeSet集合存储元素的特点
    无序不可重复的,但是存储的元素可以自动按照大小顺序排序,称为可排序集合

    概述ArrayList、LinkedList和Vector的区别

    相同点:都实现了list接口
    ArrayList和Vector底层都使用Object[] elementDate存储

    不同点:ArrayList底层的实现是数组,而LinkedList是双向链表。
    ArrayList进行随机访问所消耗的时间是固定的,因此随机访问时效率比较高。
    LinkedList是不支持快速的随机访问的,但是在插入删除时效率比较高。
    Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
    两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会
    扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)
    Vector可以设置增长因子,而ArrayList不可以。
    ArrayList有三个构造方法,
    public ArrayList(int initialCapacity) { 参数是初始化容积值
            if (initialCapacity > 0) {
                this.elementData = new Object[initialCapacity];
            } else if (initialCapacity == 0) {
                this.elementData = EMPTY_ELEMENTDATA;  空数组
            } else {
                throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
            }
        }
        
        public ArrayList() {  使用的是延迟初始化数组的策略,这里给elementData数组赋值为空数组,当第一次添加元素时才进行数组的初始化操作
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;  
        }
        public ArrayList(Collection c) { 用于集合类型数据的转换
            elementData = c.toArray();
            if ((size = elementData.length) != 0) {
                if (elementData.getClass() != Object[].class)
                    elementData = Arrays.copyOf(elementData, size, Object[].class);
            } else {
                this.elementData = EMPTY_ELEMENTDATA;
            }
        }
    Vector有四个构造方法。
     public Vector(int initialCapacity, int capacityIncrement) { 可以设置初始化容积和扩容步长值
            super();
            if (initialCapacity < 0)
                throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
            this.elementData = new Object[initialCapacity];
            this.capacityIncrement = capacityIncrement;
        }
        public Vector(int initialCapacity) { 只有一个初始化容积值,则默认的扩容步长值为0
            this(initialCapacity, 0);
        }
        public Vector() {
            this(10);  Vetor默认立即初始化操作,ArrayList默认采用的是延迟初始化数组的方式。这里可以看到默认的初始化容积值为10
        }
        public Vector(Collection c) { 可以将Collection转换为Vector类型
            elementData = c.toArray();
            elementCount = elementData.length;
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, elementCount, Object[].class);  参数1是原来的数组,参数2是新长度,参数三为目标类型
        }

    如何选用:ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
                      LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
                      Vector:数组实现,重量级 (线程安全、使用少)

  • 相关阅读:
    企业分账如何帮助用户解决成本优化和预算分配的问题
    linux jar包class热部署 工具 arthas安装及使用
    配置中心
    C++对象模型探索--02对象
    路飞项目day1
    使用mcl-loadlib实现Python64位调用32位dll
    [BluehensCTF 2022] pwn11 crypto3
    ARM体系结构基础知识--大纲
    迁移kubelet、docker和containerd工作目录
    产品思维训练 | 常见的用户增长手段有哪些?
  • 原文地址:https://blog.csdn.net/hanxuya/article/details/126590785