• Java-集合第三篇List集合


    1、List集合

      有序可重复集合,集合中的每个元素都有其对应的顺序索引。

      

    2、List相对于Collection额外提供的方法:

       1》void add(int index,Object element):将元素element插入到List集合的index处。

       2》boolean assAll(int index,Collection c):将集合c所包含的所有元素都插入到List集合的index处。

       3》Object get(int index):返回集合index索引处的元素。

       4》int indexOf(Object o):返回对象o在集合List中第一次出现的位置索引。

       5》int lastIndex(Object o):返回对象o在List集合中最后一次出现的位置索引。

       6》Object remove(int index):删除并返回index索引处的元素。

       7》Object set(int index,Object element):将index索引处的元素替换成element对象,返回被替换的旧元素。

       8》List subList(int fromIndex,int toIndex):返回从索引fromIndex(包含)到索引toIndex(不包含)处所有集合元素组成的子集合。

      与Set相比,List增加了根据索引来插入、替换、删除集合元素的方法。Java 8还为List增加了两个默认方法:

       9》void replaceAll(UnaryOperator operator):根据operator指定的计算规则重新设置List集合的所有元素。

     10》void sort(Comparator c):根据Comparator参数对List集合的元素排序。

    3、List判断两个对象相等只要通过equals()方法比较true即可。

    4、当调用List的set(int index,Object element)方法来改变List集合指定索引处的元素时,指定的索引必须是List集合有效的索引

         即set(int index,Object element)方法不会改变List集合的长度。

    5、ListIterator

        List还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象。ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口基础上增加了如下方法:

         1》boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。

         2》Object previous():返回该迭代器的上一个元素。

         3》void add(Object o):在指定位置插入一个元素。

         即ListIterator增加了向前迭代的功能(Iterator只有向后迭代),ListIterator还可以通过add()方法向List集合添加元素(Iterator只能删除元素)。

    6、ArrayList和Vector实现

       (1)ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[]数组。ArrayList或Vector通过initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,它们的initialCapacity会自动增加。一般不需理会initialCapacity,当需要增加大量的元素时,可以使用ensureCapacity(int minCapacity)方法一次性曾增加initialCapacity。还可以减少重分配的次数,从而提高性能。

       AarrayList和Vector提供了如下两个方法重新分配Object[]数组

         1》void ensureCapacity(int minCapacity):将ArrayList或Vector集合的Object[]数组长度增加大于或等于minCapacity值。

         2》void trimToSize():调整ArrayList或Vector集合中Object[]数组长度为当前元素的个数。调用该方法可以减少集合对象占用的存储空间。

       (2)ArrayList作为List的主要实现类。Vector属于在集合框架出来之前的产物,缺点比较多,不推荐使用。

       (3)ArrayList与Vector一个显著区别:ArrayList不是线程安全的,但Vectory则是线程安全的。ArrayList可以通过Collections工具类的包装编程线程安全的。

       (4)Vector提供了一个Stack子类(也是线程安全的),用于模拟“栈”这种数据结构(后进先出)。进栈出栈都是Object,因此从栈中取元素后必须进行类型转换,Stack提供的方法有:

           1》Object peek():返回“栈”的第一个元素,但并不将该元素“pop”出栈。

           2》Object pop():返回“栈”的第一个元素,并将该元素“pop”出栈。

           3》void push(Object item):将一个元素“push”进栈,最后一个进栈的元素总是位于栈顶。

           Stack同样存在性能问题,可以替代的选择是ArrayDeque。ArrayDeque也是List的实现类,ArrayDeque既实现了List接口,也实现了Deque接口,由于实现了Deque接口,因此可以作为栈来使用。而且ArrayDeque底层也是基于数组实现的,因此性能也很好。

    7、固定长度的List

       操作数组的工具类Arrays,提供了asList(Object... a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。

       Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合中的元素,不可增加、删除该集合中的元素。

  • 相关阅读:
    【leetcode】第一个只出现一次的字符
    【leetcode】0~n1中缺失的数字
    054696
    053695
    053694
    053693
    053692
    053691
    053690
    053689
  • 原文地址:https://www.cnblogs.com/ZeroMZ/p/11382131.html
Copyright © 2020-2023  润新知