ArrayList和LinkedList的底层源码之我见

来源:互联网 发布:芜湖一中王海飞 知乎 编辑:程序博客网 时间:2024/06/11 08:16

ArrayList集合,都是基于最基本的对数组的操作.(可以说数组是它的灵魂)

修饰符transient:不被序列化

实现IO的 序列化接口

判断索引是否越界异常,

判断容量是否足够,不够就将容量做位运算右移一位(1.5倍)在判断是否足够....(即扩容算法)

通过变量modCount,多线程访问避免抛出索引越界异常而是抛出并发修改异常

增删底层就是弄一个新的数组Arrays.copyof方法存入数据返回.......

底层都是基于最原始操作进行的.

数组

数组的底层又是怎么样的?,数组的底层可以说已经是内存级别的东西了,但是它与基本数据类型有有所不同,虚拟机对他有特殊的操作.对于基本数据类型可以说已经是'元数据'级别了,

数组只是在内存开辟了一个连续的空间用来存储基本数据类型的值和引用类型的地址值.

LinkedList集合 都是基于对链表类的操作(链表类是它的灵魂)

链表类:java.util.LinkedList.Node<E>

它是LinkedList类的内部类: 

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

从链表类的源码可以看出,它是极其简单的一个类:包括一个满参构造和三个字段,分别是:节点元素(就是我们存储的元素对象),上一个链表类地址,下一个链表类地址.

LinkedList集合操作都是基于对这个类的基本操作.


阅读全文
0 0
原创粉丝点击