Java集合源码阅读之ArrayList和LinkedList

源码阅读(8):Java中主要的List、Deque结构——LinkedList集合(下) 典型的数据结构中,对于“表”结构的定义是:在一维空间下元素按照某种逻辑结构进行线性连接排列的数据结构(一对一)。java中集合定义中所包括的链表(ArrayList)、链表(LinkedList)、各种队列(Queue/Deque)、栈(Stack)等都满足这样的定义。本文及后续的几篇文章中将介绍Java集合结构中关于List接口、Queue接口、Set接口下的重要实现类。注意,关于java.util.concurrent包下对于List接口、Queue接口和Set接口实现类的介绍,将在后续专门的文章介绍 阅读详情

Java集合源码阅读之ArrayList和LinkedList

1.1 ArrayList

1.1.1 构造函数

默认大小为10,能够指定大小创建,内部是数组实现。数组的size和capacity是不同的,size是实际元素个数,capacity表示最大数组容量。

    transient Object[] elementData; // non-private to simplify nested class access
    protected transient int modCount = 0;
    private static final int DEFAULT_CAPACITY = 10;

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

1.1.2 add方法

在添加元素时,会确保容量Capacity。并且会增加modCount。
在指定位置添加元素后会导致后续元素向后移动。内部通过数组拷贝实现。

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }


    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

1.1.3 get方法

使用数组下标,并且对下标范围检查。

    @SuppressWarnings("unchecked")
    E elementData(int index) {
        return (E) elementData[index];
    }

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

1.1.4 set方法

返回被替换的对象。

public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

1.1.5 remove方法

remove 会根据下标和数值移除元素。

  public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = 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;
    }

    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

    private void fastRemove(int index) {
        modCount++;
        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
    }

如果是List,调用默认是remove(int index)方法。需要注意:

        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(200);
        list.add(7);
        //报错
        list.remove(200);
        System.out.println(list);

1.1.6 index方法

简单的循环遍历。

 public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

    public int lastIndexOf(Object o) {
        if (o == null) {
            for (int i = size-1; i >= 0; i--)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = size-1; i >= 0; i--)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

1.1.7 clear方法

会导致数组内部所有元素为null,但是数组的capacity暂不变化。size为0。

    public void clear() {
        modCount++;

        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;

        size = 0;
    }

1.1.8 Iterator迭代器

List接口定义了Iterator<E> iterator();方法,ArrayList对起实现如下:

    public Iterator<E> iterator() {
        return new Itr();
    }
    
  	private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        Itr() {}

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        @Override
        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> consumer) {
            Objects.requireNonNull(consumer);
            final int size = ArrayList.this.size;
            int i = cursor;
            if (i >= size) {
                return;
            }
            final Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {
                throw new ConcurrentModificationException();
            }
            while (i != size && modCount == expectedModCount) {
                consumer.accept((E) elementData[i++]);
            }
            // update once at end of iteration to reduce heap write traffic
            cursor = i;
            lastRet = i - 1;
            checkForComodification();
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }

1.1.9 ListIterator迭代器

AbstractList 抽象类 定义了public ListIterator<E> listIterator() 方法,
ListIterator 可以前向和后向遍历。
ArrayList对起重写如下:


 public ListIterator<E> listIterator() {
     return new ListItr(0);
 }
 
private class ListItr extends Itr implements ListIterator<E> {
        ListItr(int index) {
            super();
            cursor = index;
        }

        public boolean hasPrevious() {
            return cursor != 0;
        }

        public int nextIndex() {
            return cursor;
        }

        public int previousIndex() {
            return cursor - 1;
        }

        @SuppressWarnings("unchecked")
        public E previous() {
            checkForComodification();
            int i = cursor - 1;
            if (i < 0)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i;
            return (E) elementData[lastRet = i];
        }

        public void set(E e) {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.set(lastRet, e);
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        public void add(E e) {
            checkForComodification();

            try {
                int i = cursor;
                ArrayList.this.add(i, e);
                cursor = i + 1;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }
    }

1.1.10 Fail-Fast机制:

ArrayList也采用了快速失败的机制,通过记录modCount参数来实现。在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。

1.1.11 trimToSize方法

为最小化存储容量,方法将数组elementData缩小到实际存储大小。

    public void trimToSize() {
        modCount++;
        if (size < elementData.length) {
            elementData = (size == 0)
              ? EMPTY_ELEMENTDATA
              : Arrays.copyOf(elementData, size);
        }
    }

1.2 LinkedList

LinkedList 还继承了AbstractSequentialList、Deque。它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。关于栈或队列,现在的首选是ArrayDeque,性能比LinkedList更好。

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

1.2.1 构造函数

LinkedList底层通过双向链表实现,双向链表的每个节点用内部类Node表示。LinkedList通过first和last引用分别指向链表的第一个和最后一个元素。这里没有所谓的哑元,当链表为空的时候first和last都指向null。 用 transient Node<E> first; transient Node<E> last;来存储头尾节点。

    transient int size = 0;
    transient Node<E> first;
    transient Node<E> last;

    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;
        }
    }
    
    public LinkedList() {
    }

    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }

1.2.2 getFirst方法 和 getLast方法

直接返回头尾节点。

   public E getFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return f.item;
    }

    public E getLast() {
        final Node<E> l = last;
        if (l == null)
            throw new NoSuchElementException();
        return l.item;
    }

1.2.3 removeFirst方法 和 removeLast方法

为删除头、尾特别写了方法。

    public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
    }

    public E removeLast() {
        final Node<E> l = last;
        if (l == null)
            throw new NoSuchElementException();
        return unlinkLast(l);
    }

1.2.4 unlinkFirst方法 和 unlinkLast方法

专业的代码!为了GC及时回收,在删除节点后会将其引用置空。

    private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; // help GC
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }

    /**
     * Unlinks non-null last node l.
     */
    private E unlinkLast(Node<E> l) {
        // assert l == last && l != null;
        final E element = l.item;
        final Node<E> prev = l.prev;
        l.item = null;
        l.prev = null; // help GC
        last = prev;
        if (prev == null)
            first = null;
        else
            prev.next = null;
        size--;
        modCount++;
        return element;
    }

1.2.5 remove方法

remove(Object o) 时,如果本身o为null,那么简单了,不必比较。否则遍历。

    public boolean remove(Object o) {
        if (o == null) {
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null) {
                    unlink(x);
                    return true;
                }
            }
        } else {
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item)) {
                    unlink(x);
                    return true;
                }
            }
        }
        return false;
    }

remove(int index)在删除元素时直接断开连接unlink(node(index));.

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

1.2.6 unlink(Node x)方法

断开元素就是删除了,核心在于prev.next = next;next.prev = prev;。

    E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;

        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }

1.2.7 add方法

如果在末尾添加linkLast,否则做插入linkBefore。此效率高于数组。add(int index, E element)方法根据index查找定位,由于是链表效率低下,这里使用size 确定查找方向,节约时间。

    public boolean add(E e) {
        linkLast(e);
        return true;
    }
    
    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++;
    }
    
    public void add(int index, E element) {
        checkPositionIndex(index);

        if (index == size)
            linkLast(element);
        else
            linkBefore(element, node(index));
    }

	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;
        }
    }
    
    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++;
    }

1.2.8 addAll方法

通过 Object[] a = c.toArray();迭代添加。

    public boolean addAll(Collection<? extends E> c) {
        return addAll(size, c);
    }
    
  	public boolean addAll(int index, Collection<? extends E> c) {
        checkPositionIndex(index);

        Object[] a = c.toArray();
        int numNew = a.length;
        if (numNew == 0)
            return false;

        Node<E> pred, succ;
        if (index == size) {
            succ = null;
            pred = last;
        } else {
            succ = node(index);
            pred = succ.prev;
        }

        for (Object o : a) {
            @SuppressWarnings("unchecked") E e = (E) o;
            Node<E> newNode = new Node<>(pred, e, null);
            if (pred == null)
                first = newNode;
            else
                pred.next = newNode;
            pred = newNode;
        }

        if (succ == null) {
            last = pred;
        } else {
            pred.next = succ;
            succ.prev = pred;
        }

        size += numNew;
        modCount++;
        return true;
    }

1.2.9 Clear方法

用Node<E> next = x.next;存储next指针并赋值回x。

    public void clear() {
        // Clearing all of the links between nodes is "unnecessary", but:
        // - helps a generational GC if the discarded nodes inhabit
        //   more than one generation
        // - is sure to free memory even if there is a reachable Iterator
        for (Node<E> x = first; x != null; ) {
            Node<E> next = x.next;
            x.item = null;
            x.next = null;
            x.prev = null;
            x = next;
        }
        first = last = null;
        size = 0;
        modCount++;
    }

1.2.10 get方法

还是调用了node(index)方法来确定元素。

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

1.2.11 set方法

简单替换。

    public E set(int index, E element) {
        checkElementIndex(index);
        Node<E> x = node(index);
        E oldVal = x.item;
        x.item = element;
        return oldVal;
    }

1.2.12 indexOf方法

底层调用equals方法。lastIndexOf是反向遍历。

    public int indexOf(Object o) {
        int index = 0;
        if (o == null) {
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null)
                    return index;
                index++;
            }
        } else {
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item))
                    return index;
                index++;
            }
        }
        return -1;
    }
    public int lastIndexOf(Object o) {
        int index = size;
        if (o == null) {
            for (Node<E> x = last; x != null; x = x.prev) {
                index--;
                if (x.item == null)
                    return index;
            }
        } else {
            for (Node<E> x = last; x != null; x = x.prev) {
                index--;
                if (o.equals(x.item))
                    return index;
            }
        }
        return -1;
    }

1.2.13 队列方法

    public E peek() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
    }
    public E poll() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }
    public boolean offer(E e) {
        return add(e);
    }

1.2.14 队列方法

    public E peekFirst() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
     }

    public E peekLast() {
        final Node<E> l = last;
        return (l == null) ? null : l.item;
    }
    public E pollFirst() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
    }

    public E pollLast() {
        final Node<E> l = last;
        return (l == null) ? null : unlinkLast(l);
    }
        public boolean offerFirst(E e) {
        addFirst(e);
        return true;
    }

    public boolean offerLast(E e) {
        addLast(e);
        return true;
    }

1.2.15 栈方法

    public void push(E e) {
        addFirst(e);
    }

    public E pop() {
        return removeFirst();
    }
    
    public E peek() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
    }

总结

随机访问、根据下标取数的话还是使用ArrayList吧;LinkedList的一个宽接口的实现,可以是栈、队列、双向队列、列表。
掌握这两个,编程起来真是速度飞快,不得不说Java集合设计得真是精巧,值得阅读。
java基础 系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/javabasic
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

【TC3xx芯片】TC3xx芯片电源管理系统PMS详解 本文主要介绍了TC3xx芯片的电源管理系统(PMS),重点探讨了供电模式选择、电源监控机制及电源管理模式。文章首先分析了4种供电模式及其硬件配置方式,详细说明了3.3V单电源供电模式的特点;其次阐述了Primary和Secondary两种电源监控机制,包括阈值配置和异常中断处理;最后重点讲解了CPU和系统的电源管理模式,特别对Standby模式及其进入/退出条件进行了详细说明。文章以软件开发视角解析了TC3xx芯片的电源管理功能,为ECU低功耗设计提供了技术参考。 阅读详情

相关推荐

Chapter 5 Gate Drivers and Level Shifters

Gate driver如下图所示, 包括功率管(带保护), Gate driver, Level shifter, Gate Supply 和Dead-time control.

2304_76736886的博客 2237

ArrayList和LinkedList实现

在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;Java基础,ArrayList和LinkedList在实际中已经使用很多了,探究一下他的底层实现。在add 中出现了modCount++,在 AbstractList中定义,

zl5186888的博客 384

PX4与ROS协同仿真:从键盘控制到无人机自主飞行

本文详细介绍了如何搭建PX4与ROS协同仿真环境,实现从键盘控制到无人机自主飞行的完整流程。通过XTDrone项目整合PX4飞控、ROS通信框架与Gazebo物理引擎,逐步讲解环境配置、键盘控制实现原理,并深入剖析了迈向Offboard模式实现自主飞行的核心代码与数据流,为无人机算法开发与测试提供了安全的仿真沙盒。

weixin_29169899的博客 498

linkedlist和arraylist的区别是什么

主要区别:ArrayList是Array(动态数组)的数据结构,而LinkedList是Link(链表)的数据结构。随机访问(get和set)时,ArrayList优于LinkedList;新增和删除操作,LinedList比较占优势。 LinkedeList和ArrayList的区别 1、数据结构不同 ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的...

thunder-1 2098

UE5与Cesium for Unreal结合:打造高效离线地图解决方案

本文详细介绍了如何利用UE5与Cesium for Unreal结合打造高效离线地图解决方案,特别适用于数字孪生、军事仿真等网络不稳定场景。通过优化配置、数据处理和性能调优,实现TB级地形数据的流畅渲染,并结合实战案例展示了在油田巡检等复杂环境中的应用效果。

weixin_29007135的博客 493

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 322

java中的list: ArrayList、LinkedList 以及简单实现LinkedList

ArrayList是基于动态数组实现的,在初始容量不够的时候会扩展位为原容量的1.5倍。所有数据都是按顺序存储在内存中。所以查找操作的时间复杂度为O(1),正常插入的时间复杂度为O(1),当需要进行扩容的时候时间复杂度变为O(N)。插入,删除的时间复杂度都为O(N)...

FakerWhite55OPEN的博客 464

【通信协议】I2C总线(一主多从)

I2C总线(一主多从)之软件模拟代码详解

m0_75090944的博客 9841

ArrayList和LinkedList的区别及使用场景

从图中可以看出: 1. List是一个接口,它继承与Collection接口,代表有序的队列。 2. AbstractList是一个抽象类,它继承与AbstractCollection。AbstractList实现了List接口中除了size()、get(int location)之外的方法。 3. AbstractSequentialList是一个抽象类,它继承与AbstrctList。AbstractSequentialList实现了“链......

颜淡慕潇 5340

RV1106的ISP配置实战:MIPI与LVDS接口的硬件连接与设备树优化

本文详细解析了RV1106芯片的ISP配置实战,重点对比了MIPI CSI-2与LVDS两种主流接口的硬件连接方案与数据流差异。通过手把手的设备树代码示例,深入讲解了单路MIPI与双路LVDS摄像头的配置要点、关键属性设置及常见避坑指南,并提供了从驱动加载检查到Media Controller工具使用的系统化调试方法,帮助开发者快速打通图像采集与处理全链路。

terraform7cloud的博客 471

Windows 游戏 EXCEPTION_ACCESS_VIOLATION 修复:3类硬件问题与5步软件排查法

本文提供Windows游戏EXCEPTION_ACCESS_VIOLATION错误的终极修复指南,涵盖3类硬件问题(内存故障、显卡问题、超频不稳定)和5步软件排查法(文件验证、驱动更新、DEP调整等),帮助玩家彻底解决0xFFFFFFFFFFFFFFFF内存访问冲突问题。

weixin_31856057的博客 2438

[java数据结构篇]List,ArrayList,LinkedList的使用

文章目录一.List的使用常用方法:代码演示:二.ArrayList的使用相关构造方法的介绍:关于ArrayList的初始容量分析:三.LinkedList的使用LinkedList的简单介绍关于LinkedList的构造方法:四.代码练习题。 一.List的使用 常用方法: 方法 解释 boolean add(E e) 尾插 e void add(int index, E element) 将 e 插入到 index 位置 boolean addAll(Collection<

qq_54883034的博客 1610

‌NTRU算法详细教程 | 2025年最新版(基于NIST后量子密码标准更新)

‌:NTRU是当前抗量子加密的黄金标准,‌。

blns_yxl的博客 1804

【Java核心面试宝典】Day2、谈一谈List接口的实现?

分布式技术专题+面试解析+相关的手写和学习的笔记pdf还有更多Java笔记分享如下:加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0插入效率受插入位置的影响分布式技术专题+面试解析+相关的手写和学习的笔记pdf还有更多Java笔记分享如下:[外链图片转存中…(img-P0Pqi2qE-1725517822227)]

2401_86963632的博客 478

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java集合框架 List、Set、Map的详细解释

java集合框架 List、Set、Map的详细解释 List的使用方法 Map的使用方法 Set的使用方法 java集合框架 List、Set、Map的详细解释 List的使用方法 Map的使用方法 Set的使用方法 java集合框架 List、Set、Map的详细解释 List的使用方法 Map的使用方法 Set的使用方法 java集合框架 List、Set、Map的详细解释 List的使用方法 Map的使用方法 Set的使用方法 java集合框架 Lis

小青龙,创造,变强 409

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java取map中一model的list值_2019秋招:460道Java后端面试高频题答案版【模块二:Java集合类】...

点击上方蓝字关注我吧 出自:http://dwz.win/kNE写在前面个人觉得 Java 集合类在面试过程中是个超高频的模块,所以一定要认真准备每个知识点。那么我个人学习这块知识点的方法是:1、阅读源码:这一块的考点可以说就是看你对有没有阅读过集合类的源码以及对其的掌握程度。因为在平时的开发中几乎每天都在和集合类打交道,只有了解清楚它们底层的实现原理,才能在日常业务开发...

weixin_31833307的博客 97

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JAVA入门基础进阶(八)—— List集合、、迭代器、增强for及底层

文章目录1.Collection集合1.1数组和集合的区别【理解】1.2集合类体系结构【理解】1.3Collection 集合概述和使用【应用】1.4Collection集合的遍历【应用】1.5增强for循环【应用】2.List集合2.1List集合的概述和特点【记忆】2.2List集合的特有方法【应用】3.数据结构3.1数据结构之栈和队列【记忆】3.2数据结构之数组和链表【记忆】4.List集合的实现类4.1List集合子类的特点【记忆】4.2LinkedList集合的特有功能【应用】4.3源码解析Arr

weixin_50594210的博客 387

java 框架集_Java集合框架概述

欢迎我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。最近一段时间再补基础,因此看了一些源码。 其中自然是要看数据结构的,因此看了看java的集合框架,跟着网上的大牛。虽然大牛们已经写的十分的完善了,但是实践出真知,自己还是跟着大牛的思路去看看了看源码,原计划2天的空余时间看完的,没想到尽管只是看,没有深入理解都已经花了接近一周的时间。 为了方便自己理解记忆,特此...

weixin_36327582的博客 126

集合框架源码分析

1. Java集合总体框架 Java集合中List,Set以及Map等集合体系详解 Java 集合系列01之 总体框架 Java集合工具包在java.util.*下,他们的继承关系如下图所示 Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections) List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口 Set下有HashSet,LinkedHas

Javaer`s blog 373

java复习

1、string、stringbuffer,strigBuilder区别 string只读字符串,引用的字符串内容不可以改变 stringBuffer、StringBuilder表示字符串对象,可以进行修改 StringBuilder是单线程环境使用没有synchronized修饰,StringBuffer多线程使用 2、抽象类和接口的对比 3、JDK的源码需要阅读的: ...

u014156013的博客 312

【初探Java之路 六 】集合1-ArrayList和LinkedList的使用与源码分析

ArrayList是Java集合框架中的一个动态数组实现。它就像一个会自动扩展的魔法背包,当你往里面塞更多东西时,它会自动变大。//学号//姓名//年龄//居住地return sid;return age;/*1:用输出语句完成主界面的编写2:用Scanner实现键盘录入数据3:用switch语句完成操作的选择4:用循环完成再次回到主界面*///创建集合对象,用于保存学生数据信息//用循环完成再次回到主界面//用输出语句完成主界面的编写。

z17711802963的博客 1692

鬼知道我看了几遍!Java常用集合类总结:ArrayList+LinkedList+Vector+HashMap+Set类+Queue/Deque类集合

JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类。本文将就JavaCollectionsFramework中常用的集合及其特点、适用场景、实现原理进行介绍,供学习者参考。当然,要真正深入理解Java的集合实现,还是要推荐去阅读JDK的源码。 点个小赞,好运不断,来个关注,青春常驻,打个小赏,工资疯涨。。。 Java提供的众多集合类由两大接口衍生而来:Collection接口和Map接口 Collecti.

banzhuanhu的博客 4089

JDK源码系列(二)—— ArrayList 和 LinkedList 深度源码解析

JDK源码系列(二)—— ArrayList 和 LinkedList 深度源码解析

LYS00Q的博客 1301

LinkedList、ArrayList源码阅读笔记&总结

LinkedList、ArrayList源码阅读笔记&总结 总结: 1.随机访问:使用ArrayList更快,ArrayList直接根据数组下标获取,LinkedList则要进行遍历 2.遍历:ArrayList实现了RandomAccess接口,ArrayList使用for(int i = 0; i < size; i++) 来遍历更快,LinkedList使用Iterator迭代器来遍历更快 3.插入:对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固

weixin_43472776的博客 1203

ArrayList 和 LinkedList 源码阅读

Java集合类 集合类顶层接口 Java 集合类中有大量数据迭代操作,所以底层都需要实现Iterable接口。迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。 1.Iterable接口 Iterable --iterator() --forEach(Consumer&l...

d0d0bird的博客 237

【Java源码解析】深入剖析ArrayList、LinkedList、HashMap,掌握集合类的核心实现!

通过阅读源码,我们可以更好地理解它们的底层实现原理,从而在实际开发中更加得心应手。掌握这些集合类的底层实现,可以帮助我们在实际开发中更好地选择和使用它们。是基于动态数组实现的集合类,支持快速随机访问,但插入和删除操作效率较低。是基于双向链表实现的集合类,插入和删除操作效率高,但随机访问效率低。是基于哈希表实现的键值对集合,支持快速的查找、插入和删除操作。:基于双向链表,适合频繁插入和删除,但随机访问效率低。:基于动态数组,适合随机访问,但插入和删除效率低。:基于哈希表,适合快速查找、插入和删除。

小邓学Java的博客 680
上一篇: Java SPI 浅析一二
下一篇: [剑指OFFER]之排序:JZ3 数组中重复的数字
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值