List
Collection的子类,有序可重复可索引(有脚标)。
功能如下:
添加—在指定的索引位插入元素:void add(index,element)
在指定的索引位插入一批元素:boolean addAll(int index,Collection c)
删除—删除指定index位的元素,并返回删除的元素:Object remove(int index)
获取—通过索引获取指定位置上的元素:object get(int index)
根据元素获取其位于list中的位置,如果不存在返回-1:int indexOf(object)
根据元素反向获取该元素在list中的位置,如果不存在返回-1:int lastIndexOf(object)
获取子list:List sublist(int start,int end)
特 殊列表迭代器:ListIterator ListIterator()
他是迭代器的子接口。当对元素进行迭代时,如果在迭代过程中又使用了集合对象操作元素,就容易发生ConcurrentModificationException并发修改异常。原因在于,因为在获取该迭代器时,迭代器已知的是集合现有的元素,可是在迭代器过程中,用集合对象操作元素,迭代器无法知道操作了哪些元素,做出了什么更改。
例子:
为解决上述问题List提供了自己更强大的迭代器ListIterator(原因在于它具有脚标):
增:add();
删:remove();
改:set();
查:next;
判断:hasNext();
修改—替换指定位置的元素并返回被替换的元素:Object set(index,Object)
List:有序,可重复,有索引;主要就是因为有脚标
|--ArrayList: 底层也是数组数据结构,不同步;由于数组存储是连续的,查找速度很快,更改元素效率不高;
|--LinkedList:底层是链表数据结构,非同步;由于链表存储非连续,查找速度效率不高,增删的效率较高;
|--Vector:底层也是数组数据结构,同步的,被ArrayList替代了。查询和增删的速度都不高。故被淘汰。其枚举Enumeration和Iterator功能完全一样,被后者替代:
for (Enumeration<E> e = v.elements(); e.hasMoreElements();)
System.out.println(e.nextElement());
ArryList和Vector可变长度数组的原理:
当默认10的长度的数组不够存储时,会建立一个新数组。将原来数组的内容拷贝到新的数组当中,并将新增加的元素追加到拷贝完的数组尾,如果仍然不够重复上述动作。其中,ArryList的增加是以原来50%长度进行增加,而Vector是按照100%延长。
注意:只要是常用的容器就不是同步的,因为效率比较低。
LinkedList
LinkedList特有方法:
addLast(); //JDK1.6—offerFirst()
addFirst(); //JDK1.6—offerLast()
getLast();//返回元素,并不移除,如果集合中没有元素会出现NoSuchElementException;
getFirst();//JDK1.6—peekLast();
removeLast();//移除并返回被移除的元素,如果集合中没有元素会出现NoSuchElementException;JDK1.6—pollLast();
removeFirst();// JDK1.6—pollLast();
getLast 注意:Jdk1.6中peek和poll方法如果集合中没有元素,则返回null,而不是如同get和remove方法抛出NoSuchElementException。
//JDK1.6—peekFirst();
Arraylist
Arraylist中的contains和remove方法在判断两个元素是否一致时,沿用的是Object中的equals方法,即比较的是两个对象的地址。整个List中都是如此,故当要将自定义的对象需要存储到List集合中时,需要复写对象的equals方法,建立该对象自己特有的比较两个对象是否相同的方法。