目录
基本介绍
List接口
List接口继承collection接口,拥有collection所有属性与方法
特征:有序,可重复
遍历:for,foreach,迭代器
容量:初始容量为10,负载因子0.5,每次扩容0.5倍
List接口所有实现类
ArrayList
特征:遍历速度快,但是做删除或增加性能慢
简单数据结构,超出容量自动扩容,动态数组
作为成员变量线程不安全
Linkedlist
LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部
LinkedList可被用作堆栈(stack)【包括了push,pop方法】,队列(queue)或双向队列(deque)
以双向链表实现,链表无容量限制,允许元素为null,线程不安全适合做随机的增加或删除,因为链表结构在增加删除时不会出现位移现象
Vector
线程安全(上锁),访问速度慢(不建议使用)
CopyOnWriteList
写时复制
最终性,无法做到实时性
适合读多写少
比Vector性能高
ArrayList的reomve方法
特性:remove(2) 放整形删除下标
remove(Integer.parseInt("2"))放引用数据类型删元素
示例
数据准备工作:为方便演示,需要有紧挨在一起的两个或多个相同的元素
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(3);
错误示例:
for(int i=0;i<list.size();i++){
if(list.get(i)==3) list.remove(i);//list.get(i)得到下标为i的元素
}
错误原因:因为Arraylist是动态变化的所以只会删除一个3
for(Integer i:list){
if(i==3) list.remove(i);
}
错误原因:因为ArrayList中有一个变量(modCount=原数组的元素个数)还在内部封装了一个内部类(Itr),这个内部类实现了迭代器,当使用foreach方法遍历时,使用的是ArrayList内部类的迭代器,其中内部类中定义了一个改变次数的变量(expectedModCount),这个变量被赋值为外部modcount的值,当使用内部类(Itr)发生增加或者修改操作时,抛出异常,其目的是阻止ArrayList长度发生改变。
正确示例:
for(int i=list.size()-1;i>=0;i--){
if(list.get(i)==3){
list.remove(i);
}
}
正确原因:使用了从集合中的最后一位元素向第一位元素方向进行遍历的倒序遍历方法,这样即使ArrayList的位移现象发生也无法对删除产生影响。
for(int i=0;i<list.size();i++){
if(list.get(i)==3) list.remove(i--);
}
正确原因:使用了i--,即在进行删除之后指针会向前移一位,再回到删除过的下标位置进行判断,而这样就避免了因为ArrayList的位移现象所导致的判断遗漏。