List集合

目录

基本介绍

List接口

List接口所有实现类

ArrayList

Linkedlist 

 Vector

CopyOnWriteList

ArrayList的reomve方法

示例


基本介绍

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的位移现象所导致的判断遗漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值