一.:集合框架介绍、体系图(1~6)
二.:Collection(7~32)
1:ArrayList:
1)ArrayList 注意事项:
-1:可以加入多个 null。
-2:ArrayList 是由数组:来实现数据存储的。
-3:ArrayList 基本等同于 Vector:
(除了 ArrayList 是线程不安全,但执行效率高)(不建议多线程使用)
2)JDK 1.7:
-1:ArrayList 中,维护了一个 Object 类型的数组:【 transient Object[] elementData; 】
-2:new ArrayList<>():底层创建一个底层长度为 10 的 Object[] 类型数组。
-3:list.add(“xx”):添加时,先确认容量够不够。
-4:若长度不够:默认情况下,扩容为原来的 1.5 倍。(并将原来的数据,复制到新数组)。(然后再在新数组末尾添加元素)
-5:结论:建议开发中使用带参数构造器,规定底层创建数组的长度,避免底层频繁的扩容。
3)JDK 1.8:
-1:new ArrayList<>() :底层 的 Object[] elementData 初始化为 { },长度为0,并没有创建长度为 10 的数组,
-2:list.add(“xx”):第一次调用 add() 时,底层才创建了长度为 10 的数组,并将数据 123 添加到 elementData。
-3:后续的(添加 & 扩容)操作,与 JDK 1.7 一致。
-4:老韩源码分析:
4)小结:
-1:JDK1.7 有点像 饿汉模式;JDK 1.8 有点像懒汉模式。
2:Vector:
1)基本介绍:
-1:线程安全,效率低。
-2:Vector 底层也是一个对象数组:( protected Object[] elementData; )
-3:Vector 是线程同步的,即:线程安全的。( 操作方法带有:synchronized )
-4:开发中,如果需要线程同步安全时,考虑使用 Vector。
3:LinkedList:
1)LinkedList 全面说明:
-1:LinkedList:实现了(双向链表 & 双端队列)的特点。
-2:可以添加任意元素:(包括 null)
-3:线程不安全,没有实现同步。
-4:频繁的 插入或者删除元素,建议使用 LinkedList。
-5:常用方法:
2)LinkedList 底层结构:
-1:底层维护了一个双向链表。
-2:维护了两个属性:(first & last)里面又维护了 prev、next、item 三个属性。最终实现双向链表。
1、prev:指向前一个节点;
2、nect:指向后一个节点;
-3:添加 / 删除操作:是通过链表完成的,效率高。
3)new LinkedList<>():
-1:底层使用构造方法,创建 LinkedList 对象。(长度为 0)
-2:内部 使用 Node 存储数据:Node内部封装了三个数据,前一个Node,核心数据,后一个Node;
-3:LinkedList 类内部定义两个属性:储存了链表的 头节点 和 尾节点,默认值为 null。
4)手写 链表:
/**
* @author zhangxudong@chunyu.me
* @date 2022/4/12 8:02 下午
*/
public class Test01 {
public static void main(String[] args) {
Node zhangsan = new Node("张三");
Node lisi = new Node("李四");
Node wangwu = new Node("王五");
// 张三 -> 李四 -> 王五
zhangsan.next = lisi;
lisi.next = wangwu;
wangwu.pre = lisi;
lisi.pre = zhangsan;
Node first = zhangsan;//定义头节点
Node last = wangwu; // 定义尾节点
// 添加对象:在 张三 和 李四之间,添加哈哈哈
Node hhh = new Node("哈哈哈");
zhangsan.next = hhh;
hhh.pre = zhangsan;
hhh.next = lisi;
lisi.pre = hhh;
// 链表遍历(从头到尾)
while (true) {
if (first == null) {
break;
}
System.out.println(first);
first = first.next;
}
//Node{item=张三}
//Node{item=哈哈哈}
//Node{item=李四}
//Node{item=王五}
}
}
class Node {
public Object item; // 存放数据
public Node next; // 指向下一个节点
public Node pre; // 之前前一个节点<