各个集合的特点:
List集合:是一个有序,可以重复数据的集合。它是一个接口,不能被实例化,它有几个子类,ArrayList、LinkedList、Vector、Stack。
当然是学习其子类中的方法:
ArrayList:
ArrayList顾名思义,它是一个数组集合,底层是一个数组,它的特点是,查询效率快,因为它在填装数据的时候,会给每一个数据增加索引,然后可以根据索引来查询,或者删除。它的查询效率比较快的,但是删除新增比较慢。
在ArrayList中间新增或者删除一条数据,会将原有的索引位置打乱,然后再重新排序,这样的过程是比较耗时的,比如数据量比较庞大的时候,就要考虑要不要换个集合。
扩容机制:
在初始化的对象的时候:List arrayList = new ArrayList();如果这个构造函数没有参数,那么就默认是 DEFAULT_CAPACITY 为10,也就是初始化容量是10。当集合的容量不足的时候,就会触发扩容机制,继续添加数据,就会增加适合的容量,然后再把原来的数据拷贝到新的容量当中。这个过程也是比较耗时的。
扩容方式:int newCapacity = oldCapacity + (oldCapacity >> 1),也就是以0.5被扩容,在原有的容量上加上原有容量的一半,即10+10*0.5=15;(这里的位运算左移1位就是除以2,也就是乘以0.5)而这个0.5便是负载因子(扩容因子),当容量到了10的一半,也就是5的时候就开始扩容,扩容到15。
数组的新增和删除都会对数组进行从新数据的拷贝和排序,如果知道数据多少的情况下先设置好初始容量,这样会提供性能。
LinkedList:
LinkedList看字面是一个连接的集合,所以它是一个具有链表结构的结合,它的底层是一个双向链表。链表之间的节点都有互相指向地址值的指针。既然是链表那么按照顺序读取的话就很快,但是就是会有无序读取的情况是比较慢的。查询是一个数num,是先把这个num和链表长度的一半相比较,如果num比较大那么就去链表的尾部去查找。这也和链表的尾插法有关。
相比较ArrayList,在数据量比较大情况下ArrayList的查询效率比较快,而如果删除或者是新增数据的时候LinkedList是个效率比较快。
Vector:
Vector和ArrayList相似,底层也是个数组,不同的是Vector是线程安全的。就是同一时间只能有一个线程访问Vector,当然因为它是线程安全的所以在性能方面会有一些损耗。
扩容机制:与ArrayLIst不同Vector是以原来的1倍进行扩容,原来是10那么就是10+10*1;
Vector里面的elementAt()方法和它的父类List的get()方法效果一致,elementAt()是为了兼容Vector,而get是后来JDK1.2继承了List才有的,两者效果一致。
Stack:
是继承自Vector,底层也是数组,是线程安全的栈。可以使用Vector的所有非私有方法,但作为数据栈类型,不建议使用关于非栈的方法。尽量使用关于数据栈类型的方法,这样不会破坏栈的数据结构。
网友评论