java—ArrayList集合(3)

在List集合中ArratList最为常用
特点

  • 数组队列,下标从0开始,提供添加,删除修改遍历等功能。
  • 实现RandomAccess接口,就是随机访问。通过元素的序列号快速获取元素对象,效率最快
  • 实现Cloneable接口,就有clone()函数,能被克隆
  • 不是线程安全的,限单线程使用。多线程用Vector(待续)
    属性
  • 各种函数就不一一列举,在eclipse中定义一个ArrayList出来,使用你的对象时打个点(.)不就知道它有什么方法了吗?(add,remove,clear,set)
  • elementData动态数组是一个object类型的,毕竟ArratList可以存任何类型(不能是基础类型至少是封装类型)是吧。初始化的时候就像初始化数组一样,一般会有一个数组大小。如果没有设置,默认是10。如果添加的时候超过了这个值,新的容量会变为=(原始容量*3)/2+1
  • size(),就是返回数组的实际大小,有多少个实际存在的值就返回多少

3种遍历ArrayList(比较时间):迭代器,Randomaccess,普通遍历

package ali_ArrayListTest.sty;
import java.awt.List;
import java.util.*;
import java.util.concurrent.*;
public class MyTest {
//      用迭代器来遍历
          public static void useIterator(ArrayList<Integer> list){
                    Iterator iterator = list.iterator();//必须先实现这个接口才能使用迭代器里面的方法
                    long firsttime = System.currentTimeMillis();//遍历前时间
                    while(iterator.hasNext()){
                              iterator.next();
                    }
                    long lasttime = System.currentTimeMillis();
                    System.out.println("Iterator used:  "+(lasttime-firsttime)+"  times");
          }
          
//      使用随机访问来遍历
          public static void useRandomAccess(ArrayList<Integer> list){
                    long firsttime = System.currentTimeMillis();
                    for(int i=0;i<list.size();i++){
                              list.get(i);//就像是通过数组的索引来获取值的,(其中是基于二分法查找,肯定比一个一个找快啊)注意是get()方法
                    }
                    long lasttime = System.currentTimeMillis();
                    System.out.println("RandomAccess used:  "+(lasttime-firsttime)+"  times");
          }
          
//      使用普通for循环来遍历
          public static void usePlainFor(ArrayList<Integer> list){
                    long firsttime = System.currentTimeMillis();
                    for(Integer temp:list){
                              ;//传统的遍历,相当于顺序查找
                    }
                    long lasttime = System.currentTimeMillis();
                    System.out.println("PlainFor used:  "+(lasttime-firsttime)+"  times");
          }
          
          public static void main(String[] args) {
                    // TODO Auto-generated method stub
                    ArrayList<Integer> list = new ArrayList();
                    for(int i=0;i<100000;i++){
                              list.add(i);
                    }
                    System.out.println("比较三种遍历的不同");
                    useIterator(list);
                    useRandomAccess(list);
                    usePlainFor(list);
          }
}

在这里插入图片描述
所以,可以看出RandomAccess(随机访问)速率是最快的,RandomAccess和普通遍历实际上差不多但都会比RandomAccess慢。
注意:但这并不意味着就不用迭代器了。不然还实现这个接口干嘛。对不不同的场合,如果你的集合是用的ArrayLinked(内部是双向链表),那么你是用迭代器就比你用for快了,这里不再做演示,,所以当我们拿到一个List的时候(不知道内部有没有实现RandomAccess或者一些其他的接口),应该先判断它有没有实现RandomAccess或者一些其他的接口:
方法:

private static void isRandomAccessSupported(List list) {
 if (list instanceof RandomAccess) {//判断是否实现了对应的接口
 		System.out.println("RandomAccess implemented!");
	} else {
		System.out.println("RandomAccess not implemented!");
 	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值