元素有放入顺序,元素可重复。html
JDK8源码中,初始长度是10,每次数组扩展都增长1/2左右。即:前端
private void grow(int minCapacity) { //minCapacity为size+1,每次add元素都要检查 int oldCapacity = elementData.length; //扩展前数组的容量 int newCapacity = oldCapacity + (oldCapacity >> 1); //扩展后数组的容量约为原容量1.5倍 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; elementData = Arrays.copyOf(elementData, newCapacity); }
能够经过下标来访问或者修改元素,对下标访问的set和get时间复杂度为O(1);java
一样基于数组实现,会在内存中开辟一块连续的空间来存储。ArrayList是非线程安全的,效率高;Vector是基于线程安全的,但效率低,而且是方法级别的同步,不是绝对的线程安全。
初始容量10,每次数组扩展到原来容量的2倍(每次扩充的容量大小是能够设置的,而ArrayList类不支持设定)。算法
每个元素存储自己数据的同时还存储上、下两个元素的地址(双向链表)。编程
栈,在计算机中运用普遍,好比说JVM,它就是基于栈来执行指令的。栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶,对栈的基本操做有push(进栈)和pop(出栈),前者至关于插入,后者至关于删除最后一个元素。栈有时又叫做LIFO(Last In First Out)表,即后进先出。
数组
栈通常有两种实现,全部操做时间复杂度O(1):安全
对于队列来讲,元素只能从队列尾插入,从队列头访问和删除。普通的队列是一种先进先出(First In First Out,FIFO)的数据结构,而优先队列中,元素都被赋予优先级。当访问元素的时候,具备最高优先级的元素最早被删除。
队列也是表,通常有两种实现,全部操做时间复杂度O(1)(优先队列是经过大顶堆或者小顶堆实现):数据结构
元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,可是元素在set中的位置是由该元素的HashCode决定的,其位置实际上是固定的)
Set接口有两个实现类:HashSet和LinkedHashSet多线程
SortedSet接口有一个实现类:TreeSet 底层是经过 TreeMap来实现的(如同HashSet底层是是经过HashMap来实现的同样),所以两者的实现方式几乎彻底同样。并发
元素按键值对存储,通常无放入顺序,其中值能够重复,但键是惟一的,不能重复。Map接口有三个实现类:HashMap,Hashtable,LinkeHashMap
16*0.75=12
个数据,减小冲突),增长方式:通常old*2
,因为容许设置初始容量,同时要保证容量增长后要是2的指数,因此容量增长比较复杂,详细看 http://www.cnblogs.com/xzwblog/p/7289952.html#_label2_0;old*2+1
;HashMap和Hashtable的hash值计算方式也不相同
HashMap的hash计算参考 http://www.cnblogs.com/xzwblog/p/7289952.html#_label2_0 ,速度更快。
Hashtable是直接使用对象的hashCode,而且计算在hash表中的索引时直接使用%,以下代码:
int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;
而且在高并发环境下,彻底能够用ConcurrentHashMap来代替Hashtable。
还有一点不一样:HashMap去掉了Hashtable 的contains方法,可是加上了containsValue()和containsKey()方法。
如何实现HashMap的同步?
HashMap能够经过下面的语句进行同步:Map m = Collections.synchronizeMap(hashMap);
,具体而言,该方法返回一个同步的Map,该Map封装了底层的HashMap的全部方法,使得底层的HashMap即便是在多线程的环境中也是安全的。
Collection、List、Set、Map都是接口,不能实例化。
JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。
基本数据类类型:存的是数值自己,java中有四类八种基本数据类型,
引用类型变量:存放的是数据的引用地址,并非数据的自己,引用类型变量是以间接方式去获取数据。引用类型变量都指向对象,如:数组、类、字符串等。
Collection接口的经常使用方法:
List,Set是继承自Collection接口,Map不是。因此记不清队列和栈的添加和删除函数时,一概用add和remove。
一、Collection没有get()方法来取得某个元素,只能经过iterator()遍历元素。 二、Set和Collection拥有如出一辙的接口。 三、List,能够经过get()方法来一次取出一个元素,使用数字来选择一堆对象中的一个,get(0)...。(add/get)。 四、通常使用LinkedList构造栈stack、队列queue。 五、Map用 put(k,v) / get(k),还可使用containsKey()/containsValue()来检查其中是否含有某个key/value。HashMap会利用对象的hashCode来快速找到key。 六、Map中元素,能够将key序列、value序列单独抽取出来。使用keySet()抽取key序列,将map中的全部keys生成一个Set。使用values()抽取value序列,将map中的全部values生成一个Collection。 为何一个生成Set,一个生成Collection?那是由于,key老是独一无二的,value容许重复。