• ArrayList与LinkList


    ArrayList
    public class ArrayList<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    
    1.可以看到是是实现了RandomAccess接口,查找效率比较快,是和频繁查找的操作使用
    
        private static final int DEFAULT_CAPACITY = 10;
    2.初始容量为10
    
    
       private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);//每次扩容1.5倍
            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);//扩容是基于Arrays.copy技术
        }
    3.每次扩容1.5倍,扩容是基于Arrays.copy技术把原来的数据和扩从后的容量大小复制给新的数组.
    
    transient Object[] elementData; // non-private to simplify nested class access
     public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
        }
    4.底层是基于数组实现没有大小限制,除非内存不够用
    
    5.由于是基于数组,具有序不唯一的特点

    、差集

    list9.removeAll(list10);

    并集

    addAll(list8)

    交集:list3.retainAll(list4);

    LinkedList:
    
    public class LinkedList<E>
        extends AbstractSequentialList<E>
        implements List<E>, Deque<E>, Cloneable, java.io.Serializable
    1.继承是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
    2. 由于它的底层是用双向链表实现的,所以它对元素的增加、删除效率要比ArrayList好;它是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。
    
     
    
    HashSet:
    
      public HashSet() {
            map = new HashMap<>();
        }
    1.还是用HashMap实现,所以无参数的构造函数,此构造函数创建一个大小为16的容器,加载因子为0.75
    每次扩容2的n次幂
    
    
    
      public boolean add(E e) {
            return map.put(e, PRESENT)==null;
        }
        public boolean add(E e) {
            return map.put(e, PRESENT)==null;//去重规则使用了HASHMAP的put方法,
        }
    
    由于hashmap    
    static final int hash(Object key) {
            int h;
            return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
        
     ((k = p.key) == key || (key != null && key.equals(k))))
    进行了hashcdoe和queals比较,相同的key不再继续添加
    2.每次添加的value放在了Key,原来的value有固定值PRESENT
    
    3.且无序唯一,可以存放一个null值
    
    LinkHshMap
    :
    
     */
    public class LinkedHashMap<K,V>
        extends HashMap<K,V>
        implements Map<K,V>
    
    
    1.实现了hashmap,具有hsahmap特性
    
    
    
       static class Entry<K,V> extends HashMap.Node<K,V> {
            Entry<K,V> before, after;
            Entry(int hash, K key, V value, Node<K,V> next) {
                super(hash, key, value, next);
            }
        }
    2.内部实现了双向列表
    
    
    afterNodeRemoval,afterNodeInsertion,afterNodeAccess。这三个方法的主要作用是,在删除,插入,获取节点之后,对链表进行维护
    3.具有前后节点表示,便于拼房的修改维护有好处
    
    TreeMap
    :
    TreeMap元素默认排序是按照自然排序,对于Integer是按照升序,如果是字符,返回的set,key是有序的
    存储使用了红红黑树
    红黑树是自平衡树,以上属性保证基本操作,例如:搜索 、获取、增加、和删除时间复杂度是O(log n),在增加和删除过程中不会出现长分支,短分支的情况
  • 相关阅读:
    hdu1087Super Jumping! Jumping! Jumping!(dp)
    划分树 hdu4417Super Mario
    poj2240Arbitrage(map+floyd)
    hdu4282A very hard mathematic problem
    hdu1421搬寝室(dp)
    【洛谷P3806】【模板】点分治1
    【CF914E】Palindromes in a Tree
    GDOI2020 游记
    【POJ2296】Map Labeler
    【洛谷P6623】树
  • 原文地址:https://www.cnblogs.com/wangbiaohistory/p/16129483.html
Copyright © 2020-2023  润新知