JAVA集合二 ——list(04 LinkedList)

来源:互联网 发布:linux 绑核 编辑:程序博客网 时间:2024/04/28 12:07

JAVA集合二 ——list(04 LinkedList)
     *特别声明:

     *本文只是备忘录。
     

    

     JAVA中List的实现主要有ArrayList、vector、stack、LinkedList,以及一个抽象的类AbstractList.

1、LinkedLIst

     LinkedList 被称作双向链表。索引速度慢,插入、删除速度快。

     为什么被成为双向链表,应为当前对象拥有了该对象之前的对象的引用和该对象之后的引用。

     不同于ArrayList通过数组保存对象,LinkedList通过一个内部数据结构Node<E>来保存对象。

 private static class Node<E> {        E item;        Node<E> next;        Node<E> prev;        Node(Node<E> prev, E element, Node<E> next) {            this.item = element;            this.next = next;            this.prev = prev;        }    }

我们可以看到 该数据结构中保存了3个对象,一个是当前的对象 Item,一个上一个对象的引用prev,一个后一个对象的引用next。

 每次插入元素的时候只需要保存前后元素即可。但是如果索引就需要遍历整个linkedLis(当然其实是一半)。

public class LinkedList<E>    extends AbstractSequentialList<E>    implements List<E>, Deque<E>, Cloneable, java.io.Serializable{    transient int size = 0;    /**     * Pointer to first node.     * Invariant: (first == null && last == null) ||     *            (first.prev == null && first.item != null)     */    transient Node<E> first;    /**     * Pointer to last node.     * Invariant: (first == null && last == null) ||     *            (last.next == null && last.item != null)     */    transient Node<E> last;    /**     * Constructs an empty list.     */    public LinkedList() {    }

LinkedList保存了对象个数,第一个和最后一个对象。方便用来计算。

来看看add方法:

 public boolean add(E e) {        linkLast(e);        return true; }/** * Links e as last element. */void linkLast(E e) {        final Node<E> l = last;        final Node<E> newNode = new Node<>(l, e, null);        last = newNode;        if (l == null)            first = newNode;        else            l.next = newNode;        size++;        modCount++;}

add方法在末尾添加一个对象,只需要将原来的末尾对象oldLast取出,然后将oldLast的next指向新加入的对象。同时将该对象的prev指向oldLast即可。当然新加如的对象就是最后位置的对象(当然需要创建一个Node结构),需要赋值给last(上面说的LinkedList保存的最后对象)。

另外一个在指定位置加入对象的方法:

  public void add(int index, E element) {        checkPositionIndex(index);        if (index == size)            linkLast(element);        else            linkBefore(element, node(index));  }  void linkBefore(E e, Node<E> succ) {        // assert succ != null;        final Node<E> pred = succ.prev;        final Node<E> newNode = new Node<>(pred, e, succ);        succ.prev = newNode;        if (pred == null)            first = newNode;        else            pred.next = newNode;        size++;        modCount++;   }


通过linkBefore来插入对象,linkBefore()方法2个参数,一个是插入的对象,一个是插入对象原先位置的node信息。

关键的方法是node(index)方法,查找指定位置的Node对象的方法。来看看如何实现:

 Node<E> node(int index) {        // assert isElementIndex(index);        if (index < (size >> 1)) {            Node<E> x = first;            for (int i = 0; i < index; i++)                x = x.next;            return x;        } else {            Node<E> x = last;            for (int i = size - 1; i > index; i--)                x = x.prev;            return x;        }}

可以看到是遍历获取指定位置的Node。根据传入的index的值判断是冲前获取,还是冲后获取,减少循环次数。

涉及到linkedList的索引操作都需要遍历整个list,所以会比较慢。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果ios版本太低激活不了怎么办 脸上被油烫伤了 起了水泡怎么办 皮肤被油烫伤起来个水泡怎么办 去泰国旅游没来得及兑换泰铢怎么办 游戏和安卓 不和 出现黑屏怎么办 邻居把垃圾放在楼梯口不丢怎么办 58热敏小票打印机口松了怎么办 王鹏的眼睛今天起疙瘩了怎么办 背包带子老从肩膀滑下来怎么办 绝地求生用手机流量更新不成怎么办 手机拍的视频在电脑上放不了怎么办 炉石传说手机点登陆游戏闪退怎么办 车到信号屏蔽区一键启动不了怎么办 王者荣耀战队活跃度满了怎么办 win10你的账户已被停用怎么办 电脑一键还原后一直黑屏怎么办? 被打了狂犬疫苗的狗咬伤怎么办 美版苹果7系统坏了怎么办 韩服的球球大作战网络不稳定怎么办 球球大作战号删了找不回来怎么办 队友传足球球的时候接不到怎么办 魅族手机中病毒锁机了怎么办? vbs打开是和文本文档一样怎么办 把电脑注册表删了电脑动不了怎么办 注册表删一项后电脑启动不了怎么办 解压过的过的软件安装包损坏怎么办 手机中病毒自动发短信扣费怎么办 苹果手机中的高德地图打不开怎么办 大晚上挂了别人的车怎么办 手机不兼容高版本微信怎么办 绝地求生右下角小地图变大了怎么办 杯孕当月做了C丁怎么办 玩全军出击手机发烫就出现卡怎么办 不小心买了彩虹六号肝帝版本怎么办 微信游戏刺激战场电脑卡怎么办 电脑更新了以前的东西都没了怎么办 安装黑苹果鼠标键盘不能用怎么办 苹果开机卡在白底黑苹果怎么办 信长之野望14没有剧情触发怎么办 玩cf手游手机屏幕摩擦力大怎么办 网吧有战地1没有橘子平台怎么办