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),在增加和删除过程中不会出现长分支,短分支的情况