集合讲解(ArrayList、HashMap等)
集合的用处
最主要的是以前用数组作为容器存储时,总会遇到扩容问题,数组不能自动扩容在之就是数组进行增删操作时,需要开发者自己实现 集合就优化了这些
所有集合的底层都是由Collection,Map,Iterator 三个接口派生而出;
Collection
Collection接口有三种子类型集合:List,Set,Queue,再下面是一些抽象类,可根据源码来查看。常用的就是ArrayList,Linked List,Hash Set,LinkedHashSet,ArrayBlockingQueue等(值得一提的是在JDK1.8之后可以用我们lambda表达式进行遍历);
List
List接口元素有序可重复
list接口最主要还是提供了一些索引来完成CURD,索引(index)让集合变得有序,可重复;
ArrayList
ArrayList类是List接口的实现类,其中有包含一些AbstractList和底层接口Collection的一些抽象方法(了解即可),底层数据结构是数组,有序可重复的。
ArrayList是数组的包装类,jdk1.2出现,提供了操作底层数据的很多方法,同时向ArrayList做添加操作时,容器可以自动扩容;
Arraylist是线程不安全的。
根据数组实现集合,可以根据角标获取其中的数据(name[1])
数组的特点:连续的内存空间,有下标。(查询快,增删慢)
查询快:通过数组的下标直接获取队形的数据。
增删慢:插入或删除元素可能会涉及到下标的移动。
ArrayList的扩容机制:ArrayList默认数组长度是10,当前数组容量占满时,会触发扩容。
扩容的规则:
(1)创建一个长度为当前数组长度1.5倍的新数组。
(2)然后将当前数组的元素拷贝到新数组,在新数组上继续添加元素。
(3)将内存地址指向新数组。
Vector
Vector也是基于数组实现,和ArrayList最大的区别就是Vector是线程安全的。
它是一个线程安全的List;
Vector和ArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用。
CopyOnWriteArrayList 的读操作不会阻塞其他操作;写操作则是通过复制一份,对复制版本进行操作,不会影响原来的数据。和 Vector 相对效率提高不少。缺点就是可能读取的不是最新的值。
LinkedList
基于链表实现 (双向链表)。
链表的特点:每一个结点元素,保存上一个元素的地址和下一个元素的地址。(查询慢,增删快)
查询慢:查询需要遍历每一个元素 。
增删快:插入,删除,只需要改变元素的地址指向。
区别于ArrayList除了以上三点,他不单单是只实现了List接口,还实现了Deque接口,