千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java

集合
List
list集合存放元素有序,可以重复,线程不安全。
1.ArrayList:底层用的是一维数组,默认容量为10,扩容机制为原来的1.5倍。
2.LinkedList:底层使用的是双向链表,
注意:ArrayList和LinkedList的比较主要在于底层不同,也就是数组跟链表进行比较。
3.Vector:已被弃用了,底层也是数组,默认容量为10,扩容机制需要查看容量增量是否大于0,若大于0则为当前长度+容量增量,否则为原来的2倍。线程安全,当效率低。
注意:ArrayList和Vector的区别:扩容机制不同,线程安全不同。
4.Stack:先进后出的原则,继承了Vector,线程安全。
注意:区分Stack哪些方法会抛出异常和Stack的特殊方法。
Set
Set集合存放元素无序(无序不等于随机),不允许重复。set的底层基本采用map。线程不安全。
1.HashSet:底层采用HashMap存放元素,Vaule存放同一个静态的static obj = new Objetc();获取到map的key单列集合。
2.TreeSet:底层采用TreeMap存放元素。
3.LinkedSet:底层采用LinkedMap存放元素。
Map
Map集合存放键值对,
1.HashMap:底层采用entry数组(也就是hash表),entry里的属性key、value、hash、next,容量必须为2的幂次方,默认容量为16,默认负载因子为0.75(取得时间与空间的平衡)。
存放元素的过程: 判断是否初始化容器,判断是否为空,为空则令下标为0,并查看0上是否有元素,有则进行遍历,查看是否有相同元素,有则进行替换value值,没有则创建一个entry,进行尾插法(jdk1.7用头插法),key值不为空需要获取hash值并在与高16位进行按位异或,在与长度减一进行与运算(使其元素更加均匀分布在哈希表中),再查看下标上是否有元素,有需要遍历,查看是否有key值是否有一样的,有需要替换value,没有相同key值,则创建一个entry,判断容器是否需要扩容(扩容需要从新计算元素下标,用其hash值与新数组长度进行按位与运算,判断其是在原来的位置还是新位置,分成2个链表放入新数组中),再插入尾巴上。
2.TreeMap:采用红黑树,需要一个比较器,进行排序,不允许null键。
3.LinkedHashMap:采用双向链表存放一个一个的entry对象和上一个下一个,存放顺序与取出顺序一致。
4.ConcurrentHashMap:线程安全,JDK1.8CAS锁。
5.HashTable:线程安全。已被弃用
注意ConcurrentHashMap和HashTable的区别:加锁方式不同:ConcurrentHashMap采用JDK1.8CAS锁(JDK1.7采用段位锁),HashTable采用sychronized加锁在方法上,效率低下。