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