Java集合框架(二)-List集合

一、List接口的实现类

Collection接口存储一组不唯一,无序的对象

List接口存储一组不唯一,有序(插入顺序)的对象

Set接口存储一组唯一,无序的对象

Map接口存储一组键值对象,提供key到value的映射

2.1 List 

List特点:有序,不唯一(可重复)

2.2 ArrayList

ArrayList实现了长度可变的数组,在内存中分配连续的空间。

优点:遍历元素和随机访问元素的效率比较高

缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低。

2.3 LinkedList

LinkedList采用链表存储方式

优点:插入、删除元素时效率比较高

缺点:遍历和随机访问元素效率低下

2.4 Vector

1、Vector也是List接口的一个子类实现

2、Vector跟ArrayList一样,底层都是使用数组进行实现的

3、面试常问区别:

      (1)ArrayList是线程不安全的,效率高;Vector是线程安全的,效率低

      (2)ArrayList在进行扩容时,是扩容1.5倍,源码如下:

/**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
private void grow(int minCapacity) {
      // overflow-conscious code
       int oldCapacity = elementData.length;
       int newCapacity = oldCapacity + (oldCapacity >> 1);
 
      .......
} 

                Vector扩容时,是扩容为原来的2倍,源码如下:

 private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);

        ........
}

二、迭代器(iterator)

       所有的集合类都默认实现了Iterable的接口,实现此接口意味着具备了增强for循环的能力,也就是for-each。增强for循环本质上使用的也是iterator的功能。在iterator的方法中,要求返回一个Iterator的接口子类实例对象,此接口中包含了

     hasNext()

     next()

ArrayList arrayList = new ArrayList();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
System.out.println("---------------iterator迭代器---------------------");
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()){
       System.out.println(iterator.next());
}

将while循环转换成for循环进行迭代遍历输出

System.out.println("---------------第二种循环:iterator迭代器---------------------");
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()){
      System.out.println(iterator.next());
}

System.out.println("---------------将while循环转换成for循环----------------------------------");
for(Iterator iterator2=arrayList.iterator();iterator2.hasNext();){
      System.out.println(iterator2.next());
}

在使用iterator进行迭代的过程中如果要删除其中的某个元素会报错:并发操作异常(ConcurrentModificationException),因此如果遍历的同时需要修改元素,建议使用listIterator()。

ListIterator iterator1 = arrayList.listIterator();
while (iterator1.hasNext()){
       Object o = iterator1.next();
        if(o.equals(1)){
                iterator1.remove();
        }
        System.out.println(o);
}

ListIterator迭代器提供了向前和向后两种遍历的方式,始终是通过cursor和lastret的指针来获取元素值及向下的遍历索引。当使用向前遍历的时候必须要保证指针在迭代器的结尾,否则无法获取结果值

 while (iterator1.hasPrevious()){
            System.out.println(iterator1.previous());
 }

 三、Arrays工具类

Arrays提供了数据操作的工具类,包含了很多方法。其中需要掌握的就是集合和数组之间的转换。

  • 数组转成list:
int[] arr = new int[]{1,2,3,4,5};
List<int[]> listInt = Arrays.asList(arr);
//第二种写法
List<Integer> listIn = Arrays.asList(1, 2, 3, 4);
  • list转成数组:
List list = new ArrayList();
Object[] objects = list.toArray();

 

posted @ 2020-12-02 16:40  豆小豆1314  阅读(42)  评论(0编辑  收藏  举报