闲暇之余,准备将Java 一些常用的数据结构进行重新的剖析,并记录博客比如LinkedList ,HashMap ,HashTable ,以及并发包所引入的集合,在博客中会陆续更新
start
哈哈,引入一张图片,链子,我们生活中常见,我们可以看到每一个扣的前后都是扣,串了起来,我们把每一个扣当作成一个数据,许多数据串在了一起就形成了
数据链集合,就是LinkedList ,我们拿掉一个扣,势必会将这个扣的前后两个扣进行重新整合,就形成了新的数据链,这么想,是不是感觉会透彻呢;
既然是一个链子,那么势必在链子的每一个数据中都维护着当前数据的上下对象数据,也就是说我这个扣需要知道我的两端是被那个扣绑着呢吧
1.所以在LinkedList 中存在一个节点对象,用于进行标示元素的上下元素Node ,如下:(想不通就想狗链子😁)
private static class Node<E> { E item; //插入的元素对象 Node<E> next;//元素的下一个节点 Node<E> prev;//元素的上一个节点 //Node 构造函数,进行链表操作 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
2.在LinkedList 中,维护着整个链表集合的第一位元素和最后一位元素,以及数量,这些都是随着数据的增加删除所动态修改的
//当前LinkedList的数量 transient int size = 0; /** * 当前list的第一位元素 * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */ transient Node<E> first; /** *当前list 的最后一位元素 * Pointer to last node. * Invariant: (first == null && last == null) || * (last.next == null && last.item != null) */ transient Node<E> last;
到这里,我们有了构造数据的上下数据对象Node 以及数据链中的第一位元素对象,以及最后一位元素对象,是不是就会很轻松的实现自己的一个数据链;好好想;
add 操作的思路:
(一).添加的元素上节点肯定的last Node
(二).添加的元素如果不指定特殊位置,会放置在链表最后,所以添加后该元素的下节点肯定是null
自己实现的代码:
//集合添加元素的操作 public void add(Object e) { Node l =last; //新添加的元素开头是last,下节点为null, Node newNode = new Node(l,e,null); //添加成功,那么将它作为最后一个元素 last= newNode; if(l==null) { first =newNode; }else { //不仅要将新元素绑定上下Node,因为链表是双向的,也要将上一个Node 绑定下节点(因为每添加一个元素都是位于链表最后,它的下节点没有指向的) l.next =newNode; } size++; }
原创打造,多多指教