4. ArrayList和LinkedList有什么区别

1.我想从几个方面 谈谈二者的区别

1.1 底层数据结构?  1.ArrayList基于动态数组存储有序数据容器Arrays.copyOf

                                 2.LinkedList基于链表方式存储有序数据的容器【1.6 使用的双向循环链表 1.7优化成无循环方式链表】

1.2 添加删除效率?元素在固定非末端位置的添加或者删除操作,LindedList【log(1)】优于ArrayList 【log(n-1)】,原因基于链表方式,修改 删除只需改动指针引用,数组需要移动对象。

1.3 为什么ArrayList随机访问速度快?

      随机访问速度快,意味着根据某个条件查询也会更加的快。

       ArrayList从原理上就是数据结构中的数组,也就是内存中一片连续的空间,这意味着,当我get(index)的时候,我可以根据         数组的(首地址+偏移量),直接计算出我想访问的第index个元素在内存中的位置。写过c的话,可以很容易的理解。
     LinkedList可以简单理解为数据结构中的链表(说简单理解,因为其实是双向循环链表),在内存中开辟的不是一段连续的空           间,而是每个元素有一个[元素|下一元素地址]这样的内存结构。当get(index)时,只能从首元素开始,依次获得下一个元素           的 地址。用时间复杂度表示的话,ArrayList的get(n)是o(1),而LinkedList是o(n)。

     

ArrayList的get()方法:时间复杂度为O(1)

public AnyType get(int idx) {
        if(idx < 0 || idx >= size())
            throw new ArrayIndexOutOfBoundsException();
        return theItems[idx];
}

 

LinkedList的get()方法:时间复杂度为O(N)

private Node<AnyType> getNode(int idx, int lower, int upper) {
        Node<AnyType> p;

        if(idx < lower || idx > upper)
            throw new IndexOutOfBoundsException();

        if(idx < (size() >> 1)) {
            p = beginMarker.next;
            for(int i = 0; i < idx; i++)
                p = p.next;
        }else {
            p = endMarker;
            for(int i = size(); i >idx; i--)
                p = p.prev;
        }

        return p;
    }

 

  

1.4 选择?   查询为主可以选择ArrayList 频繁更新可以选择LinedList,

1.5 并发如何选择? 【方法级别锁sysnchronized】Collections.synchronizedList(), Vector,

                               【在新创建的数组上操作规避并发】CopyOnWriteArrayList 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章