美文网首页
ArrayList/LinkedList

ArrayList/LinkedList

作者: 陈萍儿Candy | 来源:发表于2021-01-14 16:09 被阅读0次

    一。LinkedList:
    数据结构是双向链表

    transient Node<E> first;
    
        /**
         * Pointer to last node.
         * Invariant: (first == null && last == null) ||
         *            (last.next == null && last.item != null)
         */
        transient Node<E> last;
    

    list的增删改查
    1.增(加元素)

    /**
         * Inserts the specified element at the beginning of this list.
         *
         * @param e the element to add
         */
        public void addFirst(E e) {
            linkFirst(e);
        }
    
        /**
         * Appends the specified element to the end of this list.
         *
         * <p>This method is equivalent to {@link #add}.
         *
         * @param e the element to add
         */
        public void addLast(E e) {
            linkLast(e);
        }
    /**
         * Links e as first element.
         */
        private void linkFirst(E e) {
            final Node<E> f = first;
            final Node<E> newNode = new Node<>(null, e, f);
            first = newNode;
            if (f == null)
                last = newNode;
            else
                f.prev = newNode;
            size++;
            modCount++;
        }
    /**
         * 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++;
        }
    

    其他的方法暂时不罗列
    2.删除元素

    public E remove(int index) {
            checkElementIndex(index);
            return unlink(node(index));
        }
    

    3.修改某个元素值

    /**
         * Replaces the element at the specified position in this list with the
         * specified element.
         *
         * @param index index of the element to replace
         * @param element element to be stored at the specified position
         * @return the element previously at the specified position
         * @throws IndexOutOfBoundsException {@inheritDoc}
         */
        public E set(int index, E element) {
            checkElementIndex(index);
            Node<E> x = node(index);
            E oldVal = x.item;
            x.item = element;
            return oldVal;
        }
    

    4.查询

    public E get(int index) {
            checkElementIndex(index);
            return node(index).item;
        }
    

    二。ArrayList
    数据结构是 transient Object[] elementData;数组
    默认数组的容量大小是10;

    /**
         * Default initial capacity.
         */
        private static final int DEFAULT_CAPACITY = 10;
    

    如果容量不够,会扩容

     int newCapacity = oldCapacity + (oldCapacity >> 1);
    

    << : 左移运算符,num << 1,相当于num乘以2

     :     右移运算符,num >> 1,相当于num除以2
    

    : 无符号右移,忽略符号位,空位都以0补齐
    每次扩容相当于是原来的3/2倍;
    ArrayList的增删改查
    1,增

    /**
         * Inserts the specified element at the specified position in this
         * list. Shifts the element currently at that position (if any) and
         * any subsequent elements to the right (adds one to their indices).
         *
         * @param index index at which the specified element is to be inserted
         * @param element element to be inserted
         * @throws IndexOutOfBoundsException {@inheritDoc}
         */
        public void add(int index, E element) {
            if (index > size || index < 0)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            System.arraycopy(elementData, index, elementData, index + 1,
                             size - index);
            elementData[index] = element;
            size++;
        }
    

    2.删

    public E remove(int index) {
            if (index >= size)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    
            modCount++;
            E oldValue = (E) elementData[index];
    
            int numMoved = size - index - 1;
            if (numMoved > 0)
                System.arraycopy(elementData, index+1, elementData, index,
                                 numMoved);
            elementData[--size] = null; // clear to let GC do its work
    
            return oldValue;
        }
    

    3.改

    public E set(int index, E element) {
            if (index >= size)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    
            E oldValue = (E) elementData[index];
            elementData[index] = element;
            return oldValue;
        }
    

    4.查询

    public E get(int index) {
            if (index >= size)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    
            return (E) elementData[index];
        }
    

    相关文章

      网友评论

          本文标题:ArrayList/LinkedList

          本文链接:https://www.haomeiwen.com/subject/zbqpaktx.html