Java集合实现类区别与联系

ArrayList和LinkList相同点和区别:

共性:

都实现了List接口,都是list的实现类,处理list集合操作。

区别:

ArrayList:底层存储结构是数组,每个元素都有index标记元素所在位置,所以执行查询的时候速度比较快。但执行插入或删除时因为要移动这个元素后面所有元素的index,所以速度比较慢。而且但数组长度大于初始化长度时,每增加一个数组元素都需要扩容。

ArrayList get获取元素

//ArrayList数据存储与数组中
   transient Object[] elementData; 
//get只需要从数组中拿到index这个位置的元素即可
    E elementData(int index) {
        return (E) elementData[index];
    }

ArrayList add新增元素

//add如果新增元素的index大于内存数组length,需要复制数组
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

//复制数组Arrays.copyOf,这比较耗时
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

 

LinkList:底层存储结构是链表,和车链一样,一个元素只需要记录这个元素前面的那个元素和后面的那个元素,所以执行插入或删除时也只要改变前后两个元素的记录即可,因此比较快。但查询需要挨个查,因此比较慢。

 LinkList add

//新增元素,每个元素都会新建一个Node对象,并且记住前后节点的对象,把新建的元素添加到末尾
    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++;
    }

 

  LinkList get

//先使用二分法判断是从前到后还是从后到前,再逐个循环获取指定的元素
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;
        }
    }

 

 

Hashmap和hashtable共性和区别:

共性:

底层实现都是hash结构,既数组加链表。以长度为16的哈希结构为例。每个元素的key会除于16得到的余数1 2 3...16,所以排列的位置也是1 2 3...16,以key余数是1的所有元素为例,里面的元素存储结构是链表结构。

区别:

Hashmap继承AbstractMap类,hashtable继承Dictionary

Hashmap是非线程安全,hashtable是线程安全,ConcurrentHashMap是hashtabale的替代,拓展性比hashtable好。

Hashmap的key和value都可以为null,Hashtable不行

 

 

Hashtable被弃用的原因:

hashtable继承了被弃用的父类Dictionary

在单线程下hashmap效率更高,多线程下有concurrentHashmap替代hashtable

posted on 2019-01-18 08:17  周公  阅读(547)  评论(0编辑  收藏  举报

导航